package com.belladati.sdk.util.impl; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import java.util.Locale; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import com.belladati.sdk.dataset.impl.DataSetImpl; import com.belladati.sdk.dataset.impl.DataSetInfoImpl; import com.belladati.sdk.exception.impl.UnknownViewTypeException; import com.belladati.sdk.report.impl.ReportImpl; import com.belladati.sdk.report.impl.ReportInfoImpl; import com.belladati.sdk.test.SDKTest; import com.belladati.sdk.util.Localizable; import com.belladati.sdk.view.impl.ViewImpl; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @Test(dataProvider = "l10nElements") public class LocalizableTest extends SDKTest { private final String id = "id"; private final String name = "default name"; private final Locale locale1 = Locale.ENGLISH; private final Locale locale2 = new Locale("tr"); /** no localization defaults to name */ public void noLocalization(ObjectNode json, ElementCreator creator) { Localizable element = creator.create(json); assertFalse(element.hasLocalization(locale1)); assertFalse(element.hasLocalization(locale2)); assertEquals(element.getName(locale1), name); assertEquals(element.getName(locale2), name); } /** localization is returned */ public void hasLocalization(ObjectNode json, ElementCreator creator) { ObjectNode l10n = new ObjectMapper().createObjectNode(); String l1name = "english name"; String l2name = "turkish name"; l10n.put("en", l1name).put("tr", l2name); json.put("localization", l10n); Localizable element = creator.create(json); assertTrue(element.hasLocalization(locale1)); assertTrue(element.hasLocalization(locale2)); assertEquals(element.getName(locale1), l1name); assertEquals(element.getName(locale2), l2name); } /** distinguish between localized and non-localized languages */ public void hasPartialLocalization(ObjectNode json, ElementCreator creator) { ObjectNode l10n = new ObjectMapper().createObjectNode(); String l1name = "english name"; l10n.put("en", l1name); json.put("localization", l10n); Localizable element = creator.create(json); assertTrue(element.hasLocalization(locale1)); assertFalse(element.hasLocalization(locale2)); assertEquals(element.getName(locale1), l1name); assertEquals(element.getName(locale2), name); } /** case doesn't matter to find locale */ public void caseMismatch(ObjectNode json, ElementCreator creator) { ObjectNode l10n = new ObjectMapper().createObjectNode(); String lname = "english name"; l10n.put("eN", lname); json.put("localization", l10n); Localizable element = creator.create(json); Locale locale = new Locale("En"); assertTrue(element.hasLocalization(locale)); assertEquals(element.getName(locale), lname); } @DataProvider(name = "l10nElements") protected Object[][] provideElements() { return new Object[][] { { builder.buildDataSetNode(id, name, null, null, null), new ElementCreator() { @Override public Localizable create(JsonNode json) { return new DataSetImpl(service, json); } } }, { builder.buildDataSetNode(id, name, null, null, null), new ElementCreator() { @Override public Localizable create(JsonNode json) { return new DataSetInfoImpl(service, json); } } }, { builder.buildReportNode(id, name, null, null, null), new ElementCreator() { @Override public Localizable create(JsonNode json) { return new ReportImpl(service, json); } } }, { builder.buildReportNode(id, name, null, "", null), new ElementCreator() { @Override public Localizable create(JsonNode json) { return new ReportInfoImpl(service, json); } } }, { builder.buildViewNode(id, name, "chart"), new ElementCreator() { @Override public Localizable create(JsonNode json) { try { return ViewImpl.buildView(service, json); } catch (UnknownViewTypeException e) { fail("Exception building the view"); return null; } } } } }; } private interface ElementCreator { Localizable create(JsonNode json); } }