blob: 603157685a0fb8175d42e3cd307889bab12acf1a [file] [log] [blame]
// © 2019 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
package org.unicode.icu.tool.cldrtoicu;
import static com.google.common.truth.Truth.assertThat;
import static org.unicode.cldr.api.CldrData.PathOrder.ARBITRARY;
import static org.unicode.icu.tool.cldrtoicu.testing.AssertUtils.assertThrows;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nullable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.unicode.cldr.api.CldrData;
import org.unicode.cldr.api.CldrDataSupplier;
import org.unicode.cldr.api.CldrValue;
import com.google.common.collect.ImmutableList;
@RunWith(JUnit4.class)
public class FilteredDataTest {
@Test
public void testSimple() {
CldrValue keep =
ldml("numbers/currencies/currency[@type=\"USD\"]/displayName", "US Dollar");
CldrValue remove =
ldml("numbers/currencies/currency[@type=\"USD\"]/symbol", "US$");
CldrValue replace =
ldml("units/durationUnit[@type=\"foo\"]/durationUnitPattern", "YYY");
CldrValue replacement =
ldml("units/durationUnit[@type=\"foo\"]/durationUnitPattern", "ZZZ");
CldrData src = CldrDataSupplier.forValues(ImmutableList.of(keep, remove, replace));
CldrData filtered = new FilteredData(src) {
@Nullable @Override protected CldrValue filter(CldrValue value) {
if (value.equals(remove)) {
return null;
} else if (value.equals(replace)) {
return replacement;
} else {
return value;
}
}
};
List<CldrValue> filteredValues = new ArrayList<>();
filtered.accept(ARBITRARY, filteredValues::add);
assertThat(filteredValues).containsExactly(keep, replacement).inOrder();
assertThat(filtered.get(remove.getPath())).isNull();
assertThat(filtered.get(keep.getPath())).isEqualTo(keep);
assertThat(filtered.get(replace.getPath())).isEqualTo(replacement);
}
@Test
public void testBadReplacementPath() {
CldrValue replace =
ldml("numbers/currencies/currency[@type=\"USD\"]/displayName", "VALUE");
CldrValue replacement =
ldml("numbers/currencies/currency[@type=\"USD\"]/symbol", "VALUE");
CldrData src = CldrDataSupplier.forValues(ImmutableList.of(replace));
CldrData filtered = new FilteredData(src) {
@Nullable @Override protected CldrValue filter(CldrValue value) {
return replacement;
}
};
IllegalArgumentException e = assertThrows(
IllegalArgumentException.class, () -> filtered.accept(ARBITRARY, v -> {}));
assertThat(e).hasMessageThat().contains("not permitted to modify distinguishing paths");
assertThat(e).hasMessageThat().contains(replace.toString());
assertThat(e).hasMessageThat().contains(replacement.toString());
}
@Test
public void testBadReplacementAttributes() {
CldrValue replace =
ldml("numbers/currencies/currency[@type=\"USD\"]/displayName", "XXX");
CldrValue replacement =
ldml("numbers/currencies/currency[@type=\"GBP\"]/displayName", "XXX");
CldrData src = CldrDataSupplier.forValues(ImmutableList.of(replace));
CldrData filtered = new FilteredData(src) {
@Nullable @Override protected CldrValue filter(CldrValue value) {
return replacement;
}
};
IllegalArgumentException e = assertThrows(
IllegalArgumentException.class, () -> filtered.accept(ARBITRARY, v -> {}));
assertThat(e).hasMessageThat().contains("not permitted to modify distinguishing paths");
assertThat(e).hasMessageThat().contains(replace.toString());
assertThat(e).hasMessageThat().contains(replacement.toString());
}
private static CldrValue ldml(String path, String value) {
return CldrValue.parseValue("//ldml/" + path, value);
}
}