Index: lucene/core/src/test/org/apache/lucene/TestDemo.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/TestDemo.java	(revision 1330597)
+++ lucene/core/src/test/org/apache/lucene/TestDemo.java	(working copy)
@@ -18,6 +18,7 @@
  */
 
 import java.io.IOException;
+import java.util.Locale;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.MockAnalyzer;
@@ -76,4 +77,18 @@
     ireader.close();
     directory.close();
   }
+  
+  public void testLocaleRoundTrip() {
+    for (Locale locale : Locale.getAvailableLocales()) {
+      String s = locale.toString();
+      try {
+        Locale back = LuceneTestCase.localeForName(s);
+        assertEquals(locale.toString(), back.toString());
+      } catch (Exception e) {
+        System.err.println("Failed roundtrip: " + s + " (" + e.toString() + ")");
+      } catch (AssertionError e) {
+        System.err.println("Not equals: " + s + " (" + e.toString() + ")");
+      }
+    }
+  }
 }
Index: lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
===================================================================
--- lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java	(revision 1330597)
+++ lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java	(working copy)
@@ -1352,6 +1352,7 @@
   public static Locale localeForName(String localeName) {
     String elements[] = localeName.split("\\_");
     switch(elements.length) {
+      case 4: /* fallthrough for special cases */
       case 3: return new Locale(elements[0], elements[1], elements[2]);
       case 2: return new Locale(elements[0], elements[1]);
       case 1: return new Locale(elements[0]);
