blob: 885477c90360e972211c8eb7c99730649cdb1634 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 1996-2005, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package org.unicode.cldr.test;
import java.util.List;
import org.unicode.cldr.test.CheckCLDR.CheckStatus.Subtype;
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CLDRFile.Status;
import org.unicode.cldr.util.Factory;
import org.unicode.cldr.util.InternalCldrException;
import org.unicode.cldr.util.LanguageTagParser;
import org.unicode.cldr.util.Level;
import org.unicode.cldr.util.SupplementalDataInfo;
import org.unicode.cldr.util.SupplementalDataInfo.PluralInfo;
import org.unicode.cldr.util.SupplementalDataInfo.PluralType;
import org.unicode.cldr.util.ValuePathStatus;
import org.unicode.cldr.util.XMLSource;
/**
* Checks locale data for coverage.<br>
* Options:<br>
* CheckCoverage.requiredLevel=value to override the required level. values:
* comprehensive, modern, moderate, basic...<br>
* Use the option CheckCoverage.skip=true to skip a locale. For console testing,
* you want to skip the non-language locales, since they don't typically add,
* just replace. See CheckCLDR for an example.
* CoverageLevel.localeType=organization to override the organization.
*
* @author davis
*
*/
public class CheckCoverage extends FactoryCheckCLDR {
static final boolean DEBUG = false;
static final boolean DEBUG_SET = false;
private static CoverageLevel2 coverageLevel;
private Level requiredLevel;
SupplementalDataInfo supplementalData;
private boolean latin;
// private boolean requireConfirmed = true;
// private Matcher specialsToTestMatcher = CLDRFile.specialsToPushFromRoot.matcher("");
public CheckCoverage(Factory factory) {
super(factory);
}
public CheckCLDR handleCheck(String path, String fullPath, String value,
Options options, List<CheckStatus> result) {
// if (path.startsWith("//ldml/characters/parseLenients")) {
// int debug = 0;
// }
if (isSkipTest()) return this;
CLDRFile resolvedCldrFileToCheck = getResolvedCldrFileToCheck();
if (resolvedCldrFileToCheck.isPathExcludedForSurvey(path)) return this;
// skip if we are not the winning path
if (!resolvedCldrFileToCheck.isWinningPath(path)) {
return this;
}
Status status = new Status();
/*
* Need skipInheritanceMarker false for getSourceLocaleIdExtended here.
* Reference: https://unicode.org/cldr/trac/ticket/11720
*
* Compare same change in getMissingStatus for https://unicode.org/cldr/trac/ticket/11765
*/
String source = resolvedCldrFileToCheck.getSourceLocaleIdExtended(path, status, false /* skipInheritanceMarker */);
// if the source is a language locale (that is, not root or code fallback) then we have something already, so
// skip.
// we test stuff matching specialsToKeep, or code fallback
// skip anything else
if (!source.equals(XMLSource.CODE_FALLBACK_ID)
&& !source.equals("root")
&& (path.indexOf("metazone") < 0 || value != null && value.length() > 0)) {
return this; // skip!
}
if (path == null) {
throw new InternalCldrException("Empty path!");
} else if (getCldrFileToCheck() == null) {
throw new InternalCldrException("No file to check!");
}
boolean isAliased = path.equals(status.pathWhereFound);
if (ValuePathStatus.isMissingOk(resolvedCldrFileToCheck, path, latin, isAliased)) {
return this; // skip!
}
// check to see if the level is good enough
Level level = coverageLevel != null ? coverageLevel.getLevel(path) : Level.UNDETERMINED;
if (level == Level.UNDETERMINED) return this; // continue if we don't know what the status is
if (requiredLevel.compareTo(level) >= 0) {
CheckStatus.Type coverageErrorType = CheckStatus.warningType;
if (this.getPhase().equals(CheckCLDR.Phase.VETTING)) {
coverageErrorType = CheckStatus.errorType;
}
result.add(new CheckStatus().setCause(this).setMainType(coverageErrorType)
.setSubtype(Subtype.coverageLevel)
.setCheckOnSubmit(false)
.setMessage("Needed to meet {0} coverage level.", new Object[] { level }));
} else if (DEBUG) {
System.out.println(level + "\t" + path);
}
return this;
}
@Override
public CheckCLDR setCldrFileToCheck(CLDRFile cldrFileToCheck, Options options,
List<CheckStatus> possibleErrors) {
if (cldrFileToCheck == null) return this;
setSkipTest(true);
final String localeID = cldrFileToCheck.getLocaleID();
if (localeID.equals(new LanguageTagParser().set(localeID).getLanguageScript())) {
supplementalData = SupplementalDataInfo.getInstance(cldrFileToCheck.getSupplementalDirectory());
coverageLevel = CoverageLevel2.getInstance(supplementalData, localeID);
PluralInfo pluralInfo = supplementalData.getPlurals(PluralType.cardinal, localeID);
if (pluralInfo == supplementalData.getPlurals(PluralType.cardinal, "root")) {
possibleErrors.add(new CheckStatus()
.setCause(this).setMainType(CheckStatus.warningType).setSubtype(Subtype.missingPluralInfo)
.setMessage("Missing Plural Information - see supplemental plural charts to file bug.",
new Object[] {}));
}
}
if (options != null && options.get(Options.Option.CheckCoverage_skip) != null) return this;
super.setCldrFileToCheck(cldrFileToCheck, options, possibleErrors);
if (localeID.equals("root")) return this;
requiredLevel = options.getRequiredLevel(localeID);
if (DEBUG) {
System.out.println("requiredLevel: " + requiredLevel);
}
setSkipTest(false);
latin = ValuePathStatus.isLatinScriptLocale(cldrFileToCheck);
return this;
}
public void setRequiredLevel(Level level) {
requiredLevel = level;
}
public Level getRequiredLevel() {
return requiredLevel;
}
}