package freenet.l10n; import java.io.File; import java.net.URL; import java.util.Iterator; import freenet.l10n.BaseL10n.LANGUAGE; import freenet.support.HTMLNode; import freenet.support.SimpleFieldSet; import junit.framework.TestCase; public class BaseL10nTest extends TestCase { private static final String L10N_PATH = "freenet/l10n"; private static final String TEST_PATH = "../test"; public void testAddL10nSubstitution() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); HTMLNode node = new HTMLNode("div"); HTMLNode boldNode = new HTMLNode("b"); l10n.addL10nSubstitution(node, "test.substitution", new String[] {"bold"}, new HTMLNode[] {boldNode}); assertEquals("Text with <b>loud</b> string", node.generateChildren()); } public void testAddL10nSubstitutionExtra() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); HTMLNode node = new HTMLNode("div"); HTMLNode boldNode = new HTMLNode("b"); HTMLNode extraNode = new HTMLNode("extra"); l10n.addL10nSubstitution(node, "test.substitution", new String[] {"bold", "extra"}, new HTMLNode[] {boldNode, extraNode}); assertEquals("Text with <b>loud</b> string", node.generateChildren()); } public void testAddL10nSubstitutionUnclosed() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); HTMLNode node = new HTMLNode("div"); HTMLNode imgNode = new HTMLNode("img"); l10n.addL10nSubstitution(node, "test.unclosedSubstitution", new String[] {"image"}, new HTMLNode[] {imgNode}); assertEquals("Text with <img /> unclosed substitution", node.generateChildren()); } public void testAddL10nSubstitutionUnclosedMissing() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); HTMLNode node = new HTMLNode("div"); l10n.addL10nSubstitution(node, "test.unclosedSubstitution", new String[] {}, new HTMLNode[] {}); assertEquals("Text with unclosed substitution", node.generateChildren()); } public void testAddL10nSubstitutionMultiple() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); HTMLNode node = new HTMLNode("div"); HTMLNode rep1Node = new HTMLNode("r1"); HTMLNode rep2Node = new HTMLNode("r2"); HTMLNode rep3Node = new HTMLNode("r3"); l10n.addL10nSubstitution(node, "test.multipleSubstitution", new String[] {"rep2", "rep1", "rep3"}, new HTMLNode[] {rep2Node, rep1Node, rep3Node}); assertEquals("<r1>Rep 1</r1><r2>Rep 2</r2> and <r3>Rep 3</r3>", node.generateChildren()); } public void testAddL10nSubstitutionMissing() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); HTMLNode node = new HTMLNode("div"); HTMLNode rep2Node = new HTMLNode("r2"); HTMLNode rep3Node = new HTMLNode("r3"); l10n.addL10nSubstitution(node, "test.multipleSubstitution", new String[] {"rep2", "rep3"}, new HTMLNode[] {rep2Node, rep3Node}); assertEquals("Rep 1<r2>Rep 2</r2> and <r3>Rep 3</r3>", node.generateChildren()); } public void testAddL10nSubstitutionNested() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); HTMLNode node = new HTMLNode("div"); HTMLNode innerNode = new HTMLNode("in"); HTMLNode outerNode = new HTMLNode("out"); l10n.addL10nSubstitution(node, "test.nestedSubstitution", new String[] {"inner", "outer"}, new HTMLNode[] {innerNode, outerNode}); assertEquals("<out>Text and <in>replacement</in></out>", node.generateChildren()); } public void testAddL10nSubstitutionDouble() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); HTMLNode node = new HTMLNode("div"); HTMLNode tagNode = new HTMLNode("tag"); l10n.addL10nSubstitution(node, "test.doubleSubstitution", new String[] {"tag"}, new HTMLNode[] {tagNode}); assertEquals("<tag></tag>content<tag></tag>", node.generateChildren()); } public void testAddL10nSubstitutionSelfNested() throws Exception { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); HTMLNode node = new HTMLNode("div"); HTMLNode tagNode = new HTMLNode("tag"); l10n.addL10nSubstitution(node, "test.selfNestedSubstitution", new String[] {"tag"}, new HTMLNode[] {tagNode}); // it would be nice to handle this correctly, but it seems like more trouble than it's worth //assertEquals("<tag>content <tag>nested</tag></tag>", node.generateChildren()); assertEquals("test.selfNestedSubstitution", node.generateChildren()); } public void testAddL10nSubstitutionSelfNestedEmpty() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); HTMLNode node = new HTMLNode("div"); HTMLNode tagNode = new HTMLNode("tag"); l10n.addL10nSubstitution(node, "test.emptySelfNestedSubstitution", new String[] {"tag"}, new HTMLNode[] {tagNode}); assertEquals("<tag>content <tag></tag>nested</tag>", node.generateChildren()); } public void testAddL10nSubstitutionMissingBrace() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); HTMLNode node = new HTMLNode("div"); HTMLNode okNode = new HTMLNode("ok"); l10n.addL10nSubstitution(node, "test.missingBraceSubstitution", new String[] {"ok"}, new HTMLNode[] {okNode}); assertEquals("test.missingBraceSubstitution", node.generateChildren()); } public void testAddL10nSubstitutionUnmatchedClose() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); HTMLNode node = new HTMLNode("div"); HTMLNode okNode = new HTMLNode("ok"); l10n.addL10nSubstitution(node, "test.unmatchedCloseSubstitution", new String[] {"ok"}, new HTMLNode[] {okNode}); assertEquals("test.unmatchedCloseSubstitution", node.generateChildren()); } public void testAddL10nSubstitutionFallback() { BaseL10n l10n = createTestL10n(LANGUAGE.GERMAN); HTMLNode node = new HTMLNode("div"); HTMLNode tagNode = new HTMLNode("tag"); l10n.addL10nSubstitution(node, "test.badSubstitutionFallback", new String[] {"tag"}, new HTMLNode[] {tagNode}); assertEquals("Fallback <tag></tag>", node.generateChildren()); } public void testAddL10nSubstitutionMissingFallback() { BaseL10n l10n = createTestL10n(LANGUAGE.GERMAN); HTMLNode node = new HTMLNode("div"); HTMLNode boldNode = new HTMLNode("b"); l10n.addL10nSubstitution(node, "test.substitution", new String[] {"bold"}, new HTMLNode[] {boldNode}); assertEquals("Text with <b>loud</b> string", node.generateChildren()); } public void testGetString() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); String value = l10n.getString("test.sanity"); assertEquals("Sane", value); } public void testGetStringOverridden() { BaseL10n l10n = createTestL10n(LANGUAGE.ENGLISH); String value = l10n.getString("test.override"); assertEquals("Overridden", value); } public void testGetStringFallback() { BaseL10n l10n = createTestL10n(LANGUAGE.GERMAN); String value = l10n.getString("test.sanity"); assertEquals("Sane", value); } public void testGetStringFallbackOverridden() { BaseL10n l10n = createTestL10n(LANGUAGE.GERMAN); String value = l10n.getString("test.override"); assertEquals("Not overridden", value); } public void testGetStringNonexistent() { BaseL10n l10n = createTestL10n(LANGUAGE.GERMAN); String value = l10n.getString("test.nonexistent"); assertEquals("test.nonexistent", value); } public void testStrings() throws Exception { for (LANGUAGE lang : LANGUAGE.values()) { BaseL10n l10n = createL10n(lang); SimpleFieldSet fields = l10n.getCurrentLanguageTranslation(); if (fields != null) { for (Iterator<String> itr = fields.keyIterator(); itr.hasNext();) { String key = itr.next(); String value = fields.get(key); try { l10n.attemptParse(value); } catch (L10nParseException e) { fail("Error in "+key+" for "+lang+": "+e.getMessage()); } } } } } private BaseL10n createL10n(LANGUAGE lang) { File overrideFile = new File(L10N_PATH, "freenet.l10n.${lang}.override.properties"); return new BaseL10n(L10N_PATH, "freenet.l10n.${lang}.properties", overrideFile.getPath(), lang); } private BaseL10n createTestL10n(LANGUAGE lang) { String testL10nPath = new File(TEST_PATH, L10N_PATH).getPath(); URL classLoaderUrl = getClass().getClassLoader().getResource("."); File classLoaderDir = new File(classLoaderUrl.getPath()); File overrideFile = new File(new File(classLoaderDir, testL10nPath), "freenet.l10n.${lang}.override.properties"); return new BaseL10n(testL10nPath, "freenet.l10n.${lang}.properties", overrideFile.getPath(), lang); } }