/* * ModeShape (http://www.modeshape.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.modeshape.common.i18n; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.hamcrest.core.IsNot.not; import static org.hamcrest.core.IsNull.notNullValue; import static org.hamcrest.core.IsNull.nullValue; import static org.junit.Assert.assertThat; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Iterator; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.modeshape.common.CommonI18n; import org.modeshape.common.SystemFailureException; /** * @author John Verhaeg * @author Randall Hauch */ public final class I18nTest { @BeforeClass public static void beforeClass() { Locale.setDefault(Locale.US); } @Before public void beforeEach() throws Exception { clearFields(TestI18n.class); clearFields(TestI18nDuplicateProperty.class); clearFields(TestI18nFinal.class); clearFields(TestI18nFinalField.class); clearFields(TestI18nInterface.class); clearFields(TestI18nMissingLocalization.class); clearFields(TestI18nMissingProperty.class); clearFields(TestI18nNotPublicField.class); clearFields(TestI18nNotStaticField.class); clearFields(TestI18nPrivate.class); clearFields(TestI18nUnusedProperty.class); for (Entry<Locale, Map<Class<?>, Set<String>>> localeToMapEntry : I18n.LOCALE_TO_CLASS_TO_PROBLEMS_MAP.entrySet()) { for (Iterator<Entry<Class<?>, Set<String>>> iter = localeToMapEntry.getValue().entrySet().iterator(); iter.hasNext();) { if (iter.next().getKey() != CommonI18n.class) { iter.remove(); } } } } private void clearFields( Class<?> i18nClass ) throws Exception { 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) { fld.set(null, null); } } } @Test( expected = IllegalArgumentException.class ) public void shouldFailToGetLocalizationProblemLocalesIfNoClassSupplied() { I18n.getLocalizationProblemLocales(null); } @Test public void shouldNeverReturnNullWhenGettingLocalizationProblemLocales() { assertThat(I18n.getLocalizationProblemLocales(TestI18n.class), notNullValue()); } @Test( expected = IllegalArgumentException.class ) public void shouldFailToGetLocalizationProblemsForDefaultLocaleIfNoClassSupplied() { I18n.getLocalizationProblems(null); } @Test( expected = IllegalArgumentException.class ) public void shouldFailToGetLocalizationProblemsForSuppliedLocaleIfNoClassSupplied() { I18n.getLocalizationProblems(null, Locale.US); } @Test public void shouldNeverReturnNullWhenGettingLocalizationProblemsForDefaultLocale() { assertThat(I18n.getLocalizationProblems(TestI18n.class), notNullValue()); } @Test public void shouldNeverReturnNullWhenGettingLocalizationProblemsForSuppliedLocale() { assertThat(I18n.getLocalizationProblems(TestI18n.class, Locale.US), notNullValue()); } @Test public void shouldNotHaveLocalizationProblemsAfterInitializationButBeforeLocalization() { I18n.initialize(TestI18nUnusedProperty.class); assertThat(I18n.getLocalizationProblems(TestI18nUnusedProperty.class, null).isEmpty(), is(true)); assertThat(I18n.getLocalizationProblemLocales(TestI18nUnusedProperty.class).isEmpty(), is(true)); } @Test public void shouldGetLocalizationProblemsForDefaultLocaleIfNoLocaleSupplied() { I18n.initialize(TestI18nUnusedProperty.class); TestI18nUnusedProperty.testMessage.text("test"); assertThat(I18n.getLocalizationProblems(TestI18nUnusedProperty.class, null).isEmpty(), is(false)); } @Test( expected = IllegalArgumentException.class ) public void shouldFailToInitializeIfNoClassSupplied() { I18n.initialize(null); } @Test( expected = SystemFailureException.class ) public void shouldFailToInitializeFinalI18nField() { try { I18n.initialize(TestI18nFinalField.class); } catch (SystemFailureException err) { assertThat(err.getMessage(), is(CommonI18n.i18nFieldFinal.text("testMessage", TestI18nFinalField.class))); System.err.println(err); throw err; } } @Test( expected = SystemFailureException.class ) public void shouldFailToInitializeNonPublicI18nField() { try { I18n.initialize(TestI18nNotPublicField.class); } catch (SystemFailureException err) { assertThat(err.getMessage(), is(CommonI18n.i18nFieldNotPublic.text("testMessage", TestI18nNotPublicField.class))); System.err.println(err); throw err; } } @Test( expected = SystemFailureException.class ) public void shouldFailToInitializeNonStaticI18nField() { try { I18n.initialize(TestI18nNotStaticField.class); } catch (SystemFailureException err) { assertThat(err.getMessage(), is(CommonI18n.i18nFieldNotStatic.text("testMessage", TestI18nNotStaticField.class))); System.err.println(err); throw err; } } @Test public void shouldInitializeFinalClasses() { I18n.initialize(TestI18nFinal.class); assertThat(TestI18nFinal.testMessage, instanceOf(I18n.class)); } @Test public void shouldInitializePrivateClasses() { I18n.initialize(TestI18nPrivate.class); assertThat(TestI18nPrivate.testMessage, instanceOf(I18n.class)); } @Test public void shouldInitializeI18nFields() { I18n.initialize(TestI18n.class); assertThat(TestI18n.testMessage, instanceOf(I18n.class)); } @Test public void shouldNotInitializeNonI18nFields() { I18n.initialize(TestI18n.class); assertThat(TestI18n.nonI18n, nullValue()); } @Test( expected = IllegalArgumentException.class ) public void shouldFailToInitializeInterfaces() { try { I18n.initialize(TestI18nInterface.class); } catch (IllegalArgumentException err) { assertThat(err.getMessage(), is(CommonI18n.i18nClassInterface.text(TestI18nInterface.class.getName()))); System.err.println(err); throw err; } } @Test public void shouldProvideIdempotentInitialization() { I18n.initialize(TestI18n.class); assertThat(TestI18n.testMessage1.text("test"), is("test")); I18n.initialize(TestI18n.class); assertThat(TestI18n.testMessage1.text("test"), is("test")); } @Test public void shouldNotBeLocalizedAfterInitialization() { I18n.initialize(TestI18nDuplicateProperty.class); assertThat(TestI18nDuplicateProperty.testMessage.localeToTextMap.get(Locale.getDefault()), nullValue()); assertThat(TestI18nDuplicateProperty.testMessage.localeToProblemMap.get(Locale.getDefault()), nullValue()); } @Test public void shouldHaveIdThatMatchesFieldName() { I18n.initialize(TestI18n.class); assertThat(TestI18n.testMessage.id(), is("testMessage")); } @Test public void shouldNotBeLocalizedIfAskedForId() { I18n.initialize(TestI18nDuplicateProperty.class); TestI18nDuplicateProperty.testMessage.id(); assertThat(TestI18nDuplicateProperty.testMessage.localeToTextMap.get(Locale.getDefault()), nullValue()); assertThat(TestI18nDuplicateProperty.testMessage.localeToProblemMap.get(Locale.getDefault()), nullValue()); } @Test public void shouldBeLocalizedIfAskedIfHasProblem() { I18n.initialize(TestI18nDuplicateProperty.class); TestI18nDuplicateProperty.testMessage.hasProblem(); assertThat(TestI18nDuplicateProperty.testMessage.localeToTextMap.get(Locale.getDefault()), notNullValue()); assertThat(TestI18nDuplicateProperty.testMessage.localeToProblemMap.get(Locale.getDefault()), notNullValue()); } @Test public void shouldBeLocalizedIfAskedForProblem() { I18n.initialize(TestI18nDuplicateProperty.class); TestI18nDuplicateProperty.testMessage.problem(); assertThat(TestI18nDuplicateProperty.testMessage.localeToTextMap.get(Locale.getDefault()), notNullValue()); assertThat(TestI18nDuplicateProperty.testMessage.localeToProblemMap.get(Locale.getDefault()), notNullValue()); } @Test public void shouldBeLocalizedIfConvertedToString() { I18n.initialize(TestI18nDuplicateProperty.class); TestI18nDuplicateProperty.testMessage.toString(); assertThat(TestI18nDuplicateProperty.testMessage.localeToTextMap.get(Locale.getDefault()), notNullValue()); assertThat(TestI18nDuplicateProperty.testMessage.localeToProblemMap.get(Locale.getDefault()), notNullValue()); } @Test public void shouldContainAngleBracketedProblemInTextIfMissingLocalization() { I18n.initialize(TestI18nMissingLocalization.class); String text = TestI18nMissingLocalization.testMessage.text(); assertThat(text, is('<' + CommonI18n.i18nLocalizationProblems.text(TestI18nMissingLocalization.class, Locale.getDefault()) + '>')); System.out.println("Text: " + text); } @Test public void shouldHaveProblemIfMissingLocalization() { I18n.initialize(TestI18nMissingLocalization.class); assertThat(TestI18nMissingLocalization.testMessage.hasProblem(), is(true)); String problem = TestI18nMissingLocalization.testMessage.problem(); assertThat(problem, is(CommonI18n.i18nLocalizationProblems.text(TestI18nMissingLocalization.class, Locale.getDefault()))); System.out.println("Problem: " + problem); } @Test public void shouldHaveLocalicationProblemIfMissingLocalization() { I18n.initialize(TestI18nMissingLocalization.class); TestI18nMissingLocalization.testMessage.text(); assertThat(I18n.getLocalizationProblems(TestI18nMissingLocalization.class).size(), is(1)); assertThat(I18n.getLocalizationProblems(TestI18nMissingLocalization.class).iterator().next(), is(CommonI18n.i18nLocalizationFileNotFound.text(TestI18nMissingLocalization.class.getName()))); assertThat(I18n.getLocalizationProblemLocales(TestI18nMissingLocalization.class).size(), is(1)); assertThat(I18n.getLocalizationProblemLocales(TestI18nMissingLocalization.class).iterator().next(), is(Locale.getDefault())); } @Test public void shouldHaveTextIfPropertyDuplicate() { I18n.initialize(TestI18nDuplicateProperty.class); String text = TestI18nDuplicateProperty.testMessage.text("test"); assertThat(text.charAt(0), not('<')); System.out.println("Text: " + text); } @Test public void shouldHaveProblemIfPropertyDuplicate() { I18n.initialize(TestI18nDuplicateProperty.class); assertThat(TestI18nDuplicateProperty.testMessage.hasProblem(), is(true)); String problem = TestI18nDuplicateProperty.testMessage.problem(); assertThat(problem, notNullValue()); System.out.println("Problem: " + problem); } @Test public void shouldNotHaveLocalicationProblemIfPropertyDuplicate() { I18n.initialize(TestI18nDuplicateProperty.class); TestI18nDuplicateProperty.testMessage.text("test"); assertThat(I18n.getLocalizationProblems(TestI18nDuplicateProperty.class).isEmpty(), is(true)); assertThat(I18n.getLocalizationProblemLocales(TestI18nDuplicateProperty.class).isEmpty(), is(true)); } @Test public void shouldContainAngleBracketedProblemInTextIfPropertyMissing() { I18n.initialize(TestI18nMissingProperty.class); String text = TestI18nMissingProperty.testMessage1.text("test"); assertThat(text.charAt(0), is('<')); System.out.println("Text: " + text); } @Test public void shouldHaveProblemIfPropertyMissing() { I18n.initialize(TestI18nMissingProperty.class); assertThat(TestI18nMissingProperty.testMessage1.hasProblem(), is(true)); String problem = TestI18nMissingProperty.testMessage1.problem(); assertThat(problem, notNullValue()); System.out.println("Problem: " + problem); } @Test public void shouldNotHaveLocalicationProblemIfPropertyMissing() { I18n.initialize(TestI18nMissingProperty.class); TestI18nMissingProperty.testMessage1.text("test"); assertThat(I18n.getLocalizationProblems(TestI18nMissingProperty.class).isEmpty(), is(true)); assertThat(I18n.getLocalizationProblemLocales(TestI18nMissingProperty.class).isEmpty(), is(true)); } @Test public void shouldHaveLocalicationProblemIfPropertyUnused() { I18n.initialize(TestI18nUnusedProperty.class); TestI18nUnusedProperty.testMessage.text("test"); assertThat(I18n.getLocalizationProblems(TestI18nUnusedProperty.class).size(), is(1)); assertThat(I18n.getLocalizationProblemLocales(TestI18nUnusedProperty.class).size(), is(1)); assertThat(I18n.getLocalizationProblemLocales(TestI18nUnusedProperty.class).iterator().next(), is(Locale.getDefault())); } @Test public void shouldHaveTextMatchingLocalizationFilePropertyValue() { I18n.initialize(TestI18n.class); assertThat(TestI18n.testMessage.text(), is("Test Message")); } @Test( expected = IllegalArgumentException.class ) public void shouldFailIfTooFewArgumentsSuppliedToText() { I18n.initialize(TestI18n.class); try { TestI18n.testMessage1.text(); } catch (IllegalArgumentException err) { System.err.println(err); throw err; } } @Test( expected = IllegalArgumentException.class ) public void shouldFailIfTooManyArgumentsSuppliedToText() { I18n.initialize(TestI18n.class); try { TestI18n.testMessage1.text("Test", "Message"); } catch (IllegalArgumentException err) { System.err.println(err); throw err; } } @Test public void shouldContainArgumentsInRightOrderInText() { I18n.initialize(TestI18n.class); assertThat(TestI18n.testMessage2.text("Test", "Message"), is("Message Test")); } @Test public void shouldAllowReuseOfArgumentsInText() { I18n.initialize(TestI18n.class); assertThat(TestI18n.testMessage3.text("Test", "Message"), is("Message Test Message")); } @Test public void shouldContainLocaleSpecificText() { I18n.initialize(TestI18n.class); assertThat(TestI18n.testMessage.text(Locale.FRENCH), is("Message de Test")); } @Test public void shouldContainTextForDefaultLocaleIfMissingLocalizationForSuppliedLocale() { I18n.initialize(TestI18n.class); assertThat(TestI18n.testMessage.text(Locale.CHINESE), is("Test Message")); } public static class TestI18n { public static I18n testMessage; public static I18n testMessage1; public static I18n testMessage2; public static I18n testMessage3; public static Object nonI18n; } private static class TestI18nDuplicateProperty { public static I18n testMessage; } public static final class TestI18nFinal { public static I18n testMessage; } public static class TestI18nFinalField { public static final I18n testMessage = null; } public static interface TestI18nInterface { I18n testMessage = null; } private static class TestI18nMissingProperty { @SuppressWarnings( "unused" ) public static I18n testMessage; public static I18n testMessage1; } public static class TestI18nNotPublicField { static I18n testMessage; } public static class TestI18nNotStaticField { public I18n testMessage; } private static class TestI18nPrivate { public static I18n testMessage; } private static class TestI18nUnusedProperty { public static I18n testMessage; } private static class TestI18nMissingLocalization { public static I18n testMessage; } }