BearND has uploaded a new change for review. https://gerrit.wikimedia.org/r/173235
Change subject: More TranslationTest improvements ...................................................................... More TranslationTest improvements Make it more stable by not having to explicitly ignore several locales for the numeric formats. Also checking a list of possible parameter formats. Change-Id: I5c85be3f712f66fae81b3934a3a168c15a8c2814 --- M wikipedia-it/src/main/java/org/wikipedia/test/TranslationTests.java 1 file changed, 77 insertions(+), 42 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/35/173235/1 diff --git a/wikipedia-it/src/main/java/org/wikipedia/test/TranslationTests.java b/wikipedia-it/src/main/java/org/wikipedia/test/TranslationTests.java index 6b276e4..f4dd535 100644 --- a/wikipedia-it/src/main/java/org/wikipedia/test/TranslationTests.java +++ b/wikipedia-it/src/main/java/org/wikipedia/test/TranslationTests.java @@ -26,7 +26,11 @@ * TODO: check for missing translations */ public class TranslationTests extends ActivityInstrumentationTestCase2<PageActivity> { - public static final String TAG = "TrTest"; + private static final String TAG = "TrTest"; + + /** Add more if needed, but then also add some tests. */ + private static final String[] POSSIBLE_PARAMS = new String[] {"%s", "%d", "%.2f"}; + private PageActivity activity; private StringBuilder mismatches = new StringBuilder(); @@ -48,9 +52,9 @@ setLocale(Locale.ROOT.toString()); List<Res> tagRes = new ResourceCollector("<", "<").collectParameterResources(); List<Res> noTagRes = new ResourceCollector("<", "<").not().collectParameterResources(); - List<Res> stringParamRes = new ResourceCollector("%s", "%1$s").collectParameterResources(); - List<Res> decimalParamRes = new ResourceCollector("%d", "%1$d").collectParameterResources(); - List<Res> floatParamRes = new ResourceCollector("%f", "%.2f").collectParameterResources(); + List<Res> stringParamRes = new ResourceCollector("%s").collectParameterResources(); + List<Res> decimalParamRes = new ResourceCollector("%d").collectParameterResources(); + List<Res> floatParamRes = new ResourceCollector("%.2f").collectParameterResources(); AssetManager assetManager = getInstrumentation().getTargetContext().getResources().getAssets(); for (String lang : assetManager.getLocales()) { @@ -84,26 +88,19 @@ // taking forever to get those fixed :( continue; } - checkTranslationHasParameter(res, "[stringParam]", null); - } - - if (lang.startsWith("fa") || lang.startsWith("ar") || lang.equals("bn") - || lang.equals("mr") || lang.equals("my") || lang.startsWith("ne") || lang.equals("ps")) { - // don't check the number params since those languages have different string representations for numbers - continue; + checkTranslationHasParameter(res, "%s", "[stringParam]", null); } // decimal parameters for (Res res : decimalParamRes) { final int param1 = 42; - checkTranslationHasParameter(res, param1, null); + checkTranslationHasParameter(res, "%d", param1, null); } - // float parameters + // floating point parameters for (Res res : floatParamRes) { final float param1 = .27f; - checkTranslationHasParameter(res, param1, "0,27"); -// // TODO: build a list of all parameterized string resources from default strings dynamically first + checkTranslationHasParameter(res, "%.2f", param1, "0,27"); } } } @@ -114,6 +111,7 @@ public void setLocale(String lang) { myLocale = new Locale(lang); + Locale.setDefault(myLocale); Resources res = getInstrumentation().getTargetContext().getResources(); DisplayMetrics dm = res.getDisplayMetrics(); Configuration conf = res.getConfiguration(); @@ -161,22 +159,22 @@ } private void checkTranslationHasNoParameter(Res res) { - final String param1 = "[param1]"; - String translatedString = getInstrumentation().getTargetContext().getString(res.id, param1); + final String val1 = "[val1]"; + String translatedString = getInstrumentation().getTargetContext().getString(res.id, val1); // Log.i(TAG, myLocale + ":" + translatedString); - if (translatedString.contains(param1)) { - final String msg = myLocale + ":" + res.name + " = " + translatedString + "' contains " + param1; + if (translatedString.contains(val1)) { + final String msg = myLocale + ":" + res.name + " = " + translatedString + "' contains " + val1; Log.e(TAG, msg); mismatches.append(msg).append("\n"); } } - public void checkTranslationHasParameter(Res res, Object param1, String alternate) throws Exception { - String translatedString = getInstrumentation().getTargetContext().getString(res.id, param1); + public void checkTranslationHasParameter(Res res, String paramName, Object val1, String alternateFormat) throws Exception { + String translatedString = getInstrumentation().getTargetContext().getString(res.id, val1); // Log.i(TAG, myLocale + ":" + translatedString); - if (!translatedString.contains(param1.toString()) - && (alternate == null || !translatedString.contains(alternate))) { - final String msg = myLocale + ":" + res.name + " = " + translatedString + "' doesn't contain " + param1; + if (!translatedString.contains(String.format(paramName, val1)) + && (alternateFormat == null || !translatedString.contains(alternateFormat))) { + final String msg = myLocale + ":" + res.name + " = " + translatedString + "' doesn't contain " + val1; Log.e(TAG, msg); mismatches.append(msg).append("\n"); } @@ -197,7 +195,6 @@ private List<Res> collectParameterResources() { final List<Res> resources = new ArrayList<Res>(); - final R.string stringResources = new R.string(); final Class<R.string> c = R.string.class; final Field[] fields = c.getDeclaredFields(); @@ -214,23 +211,16 @@ } try { String value = getInstrumentation().getTargetContext().getResources().getString(resourceId); -// Log.i(TAG, buildLogString(i, name) + " = " + value); - if (!name.startsWith("abc_") && !name.startsWith("preference_")) { - boolean found = false; - if (value.contains("wikimediafoundation.org") && negate) { - System.out.println("found = " + found); - } - for (String paramExample : paramExamples) { - if (value.contains(paramExample)) { - found = true; - if (!negate) { - break; - } - } - } - if ((!negate && found) || (negate && !found)) { - resources.add(new Res(resourceId, name)); - } + if (name.startsWith("abc_") || name.startsWith("preference_")) { + continue; // don't care about appcompat string; and preference string resources don't get translated + } + + assertParameterFormats(name, value); + + // Find parameter + boolean found = findParameter(value); + if ((!negate && found) || (negate && !found)) { + resources.add(new Res(resourceId, name)); } } catch (Resources.NotFoundException e) { Log.w(TAG, buildLogString(i, name) + "; <not found>"); @@ -241,6 +231,51 @@ return resources; } + + /** + * If it has a parameter it should be one of POSSIBLE_PARAMS. + * If not then flag this so we can improve the tests. + */ + private void assertParameterFormats(String name, String value) { + if (value.startsWith("Last updated")) { + System.out.println(); + } + if (value.contains("%")) { + boolean ok = false; + int start = value.indexOf('%'); + for (String possible : POSSIBLE_PARAMS) { + int end = value.indexOf(getLastChar(possible), start); + if (end != -1 && end < value.length()) { + String candidate = value.substring(start, end + 1); + System.out.println("candidate = " + candidate); + if (possible.equals(candidate)) { + ok = true; + break; + } + } + } + if (!ok) { + fail("Unexpected format in " + name + ": '" + value + "'. Update tests!"); + } + } + } + + private String getLastChar(String str) { + return str.substring(str.length() - 1); + } + + private boolean findParameter(String value) { + boolean found = false; + for (String paramExample : paramExamples) { + if (value.contains(paramExample)) { + found = true; + if (!negate) { + break; + } + } + } + return found; + } } class Res { -- To view, visit https://gerrit.wikimedia.org/r/173235 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I5c85be3f712f66fae81b3934a3a168c15a8c2814 Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: BearND <bsitzm...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits