/*
 *
 */
package org.jboss.dna.common;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Locale;
import java.util.Set;
import org.jboss.dna.common.i18n.I18n;
import org.junit.Test;

/**
 * @author John Verhaeg
 */
public class AbstractI18nTest {

	private Class i18nClass;

	protected AbstractI18nTest( Class i18nClass ) {
		this.i18nClass = i18nClass;
	}

	@Test
	@SuppressWarnings( "unchecked" )
	public void shouldNotHaveLocalizationProblems() throws Exception {
		Method method = i18nClass.getDeclaredMethod("getLocalizationProblemLocales", (Class[])null);
		Set<Locale> locales = (Set<Locale>)method.invoke(null, (Object[])null);
		method = i18nClass.getDeclaredMethod("getLocalizationProblems", Locale.class);
		for (Locale locale : locales) {
			assertThat(((Set<String>)method.invoke(null, locale)).isEmpty(), is(true));
		}
	}

	@Test
	public void shouldNotHaveProblems() throws IllegalAccessException {
		for (Field fld : i18nClass.getDeclaredFields()) {
			if (fld.getType() == I18n.class && (fld.getModifiers() & Modifier.PUBLIC) == Modifier.PUBLIC
			    && (fld.getModifiers() & Modifier.STATIC) == Modifier.STATIC
			    && (fld.getModifiers() & Modifier.FINAL) != Modifier.FINAL) {
				I18n i18n = (I18n)fld.get(null);
				if (i18n.hasProblem()) {
					fail();
				}
			}
		}
	}
}

@@ -402,16 +402,25 @@
 %0Apublic 
+abstract 
 class Ab
@@ -437,17 +437,20 @@
 Test %7B%0A%0A
-%09
+    
 private 
@@ -467,17 +467,20 @@
 Class;%0A%0A
-%09
+    
 protecte
@@ -519,18 +519,24 @@
 ass ) %7B%0A
-%09%09
+        
 this.i18
@@ -555,28 +555,37 @@
 nClass;%0A
-%09%7D%0A%0A%09
+    %7D%0A%0A    
 @Test%0A
-%09
+    
 @Suppres
@@ -609,17 +609,20 @@
 cked%22 )%0A
-%09
+    
 public v
@@ -680,18 +680,24 @@
 ption %7B%0A
-%09%09
+        
 Method m
@@ -781,18 +781,24 @@
 )null);%0A
-%09%09
+        
 Set%3CLoca
@@ -861,18 +861,24 @@
 )null);%0A
-%09%09
+        
 method =
@@ -948,18 +948,24 @@
 class);%0A
-%09%09
+        
 for (Loc
@@ -988,19 +988,28 @@
 ales) %7B%0A
-%09%09%09
+            
 assertTh
@@ -1080,24 +1080,39 @@
 ));%0A
-%09%09%7D%0A%09%7D%0A%0A%09
+        %7D%0A    %7D%0A%0A    
 @Test%0A
-%09
+    
 publ
@@ -1175,18 +1175,24 @@
 ption %7B%0A
-%09%09
+        
 for (Fie
@@ -1233,19 +1233,28 @@
 ds()) %7B%0A
-%09%09%09
+            
 if (fld.
@@ -1337,23 +1337,16 @@
 r.PUBLIC
-%0A%09%09%09   
  && (fld
@@ -1399,19 +1399,28 @@
 .STATIC%0A
-%09%09%09
+            
     && (
@@ -1477,20 +1477,32 @@
 INAL) %7B%0A
-%09%09%09%09
+                
 I18n i18
@@ -1526,20 +1526,32 @@
 (null);%0A
-%09%09%09%09
+                
 if (i18n
@@ -1571,37 +1571,82 @@
 ) %7B%0A
-%09%09%09%09%09fail();%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%09
+                    fail();%0A                %7D%0A            %7D%0A        %7D%0A    
 %7D%0A%7D%0A

Fixed a bad test case.