blob: 26e7333e05a87557dea55ab9ea5d8c0ff945635c [file] [log] [blame]
package org.unicode.cldr.unittest;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.unicode.cldr.util.CldrUtility;
import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.dev.util.CollectionUtilities;
import com.ibm.icu.text.Transform;
import com.ibm.icu.text.Transliterator;
import com.ibm.icu.text.UnicodeSet;
public class TestFmwkPlus extends TestFmwk {
@SuppressWarnings("unchecked")
public <T, V, R extends TestRelation<T, V>> boolean assertTrue(
String message, T arg0, R relation, V... args) {
return assertRelation(message, true, arg0, relation, args);
}
@SuppressWarnings("unchecked")
public <T, V, R extends TestRelation<T, V>> boolean assertFalse(
String message, T arg0, R relation, V... args) {
return assertRelation(message, false, arg0, relation, args);
}
@SuppressWarnings("unchecked")
public <T, V, R extends TestRelation<T, V>> boolean assertTrue(T arg0,
R relation, V... args) {
return assertRelation(null, true, arg0, relation, args);
}
@SuppressWarnings("unchecked")
public <T, V, R extends TestRelation<T, V>> boolean assertFalse(T arg0,
R relation, V... args) {
return assertRelation(null, false, arg0, relation, args);
}
@SuppressWarnings("unchecked")
public <T, V, R extends TestRelation<T, V>> boolean assertRelation(
String message, boolean expected, T arg0, R relation, V... args) {
boolean actual = args.length == 0 ? relation.isTrue(arg0) : relation
.isTrue(arg0, args);
boolean test = expected == actual;
if (!test) {
errln(showArgs("", message, actual, arg0, relation, args)
+ "; expected " + expected);
} else if (isVerbose()) {
logln(showArgs("OK ", message, actual, arg0, relation, args));
}
return test;
}
public <E, S, T extends Transform<S, E>> boolean assertTransformsTo(
String message, E expected, T transform, S source) {
E actual = transform.transform(source);
boolean test = CldrUtility.equals(expected, actual);
if (!test) {
errln(showArgs("", message, expected, actual, transform, source)
+ "; expected " + "‹" + expected + "›");
} else if (isVerbose()) {
logln(showArgs("OK ", message, expected, actual, transform, source));
}
return test;
}
private <E, S, T extends Transform<S, E>> String showArgs(String prefix,
String message, E expected, E actual, T transform, S source) {
String simpleName = transform instanceof Transliterator ? ((Transliterator) transform)
.getID() : transform.getClass().getSimpleName();
return prefix + sourceLocationPlus() + " "
+ (message == null ? "" : message + " : ") + "got ‹" + actual
+ "› from " + simpleName + "(‹" + source + "›)";
}
@SuppressWarnings("unchecked")
private <T, V, R extends TestRelation<T, V>> String showArgs(String prefix,
String message, boolean expected, T arg0, R relation, V... args) {
StringBuilder others = new StringBuilder();
for (V arg : args) {
if (others.length() != 0) {
others.append(", ");
}
others.append(relation.showOther(arg));
}
return prefix + sourceLocationPlus() + " "
+ (message == null ? "" : message + " : ")
+ relation.showFirst(arg0) + (expected ? " " : " NOT ")
+ relation + " " + others;
}
public abstract static class TestRelation<T, U> {
@SuppressWarnings("unchecked")
public abstract boolean isTrue(T a, U... b);
@Override
public String toString() {
String name = this.getClass().getName();
int pos = name.lastIndexOf('$');
if (pos >= 0) {
return name.substring(pos + 1);
}
pos = name.lastIndexOf('.');
return pos < 0 ? name : name.substring(pos + 1);
}
public String showFirst(T a) {
return show(String.valueOf(a));
}
public String showOther(U b) {
return show(String.valueOf(b));
}
public String show(String a) {
return "‹" + a + "›";
}
}
public static class Invert<T, U> extends TestRelation<T, U> {
private final TestRelation<T, U> other;
public Invert(TestRelation<T, U> other) {
this.other = other;
}
@SuppressWarnings("unchecked")
@Override
public boolean isTrue(T a, U... b) {
return !other.isTrue(a, b);
}
@Override
public String toString() {
return "not " + other;
}
}
public static class And<T, U> extends TestRelation<T, U> {
private final TestRelation<T, U>[] others;
@SuppressWarnings("unchecked")
public And(TestRelation<T, U>... others) {
this.others = others;
}
@SuppressWarnings("unchecked")
@Override
public boolean isTrue(T a, U... b) {
for (TestRelation<T, U> other : others) {
if (!other.isTrue(a, b)) {
return false;
}
}
return true;
}
@Override
public String toString() {
return CollectionUtilities.join(others, " and ");
}
}
public static class Or<T, U> extends TestRelation<T, U> {
private final TestRelation<T, U>[] others;
@SuppressWarnings("unchecked")
public Or(TestRelation<T, U>... others) {
this.others = others;
}
@SuppressWarnings("unchecked")
@Override
public boolean isTrue(T a, U... b) {
for (TestRelation<T, U> other : others) {
if (other.isTrue(a, b)) {
return true;
}
}
return false;
}
@Override
public String toString() {
return CollectionUtilities.join(others, " or ");
}
}
@SuppressWarnings("rawtypes")
public static TestRelation CONTAINS = new TestRelation<Collection, Object>() {
@Override
public boolean isTrue(Collection a, Object... bs) {
for (Object b : bs) {
if (!a.contains(b)) {
return false;
}
}
return true;
}
@Override
public String toString() {
return "contains";
}
};
@SuppressWarnings("rawtypes")
public static TestRelation CONTAINS_ALL = new TestRelation<Collection, Object>() {
@Override
public boolean isTrue(Collection a, Object... bs) {
for (Object b : bs) {
if (!(b instanceof Collection)) {
return false;
}
if (!a.containsAll((Collection) b)) {
return false;
}
}
return true;
}
@Override
public String toString() {
return "contains-all";
}
};
@SuppressWarnings("rawtypes")
public static TestRelation CONTAINS_SOME = new TestRelation<Collection, Object>() {
@Override
public boolean isTrue(Collection a, Object... bs) {
for (Object b : bs) {
if (!(b instanceof Collection)) {
return false;
}
if (Collections.disjoint(a, (Collection)b)) {
return false;
}
}
return true;
}
@Override
public String toString() {
return "contains-some";
}
};
@SuppressWarnings("rawtypes")
public static TestRelation EMPTY = new TestRelation<Collection, Object>() {
@Override
public boolean isTrue(Collection a, Object... bs) {
if (bs.length != 0) {
throw new IllegalArgumentException(
"Should only have 1 argument");
}
return a.size() == 0;
}
@Override
public String toString() {
return "is empty";
}
};
@SuppressWarnings("rawtypes")
public static TestRelation LEQ = new TestRelation<Comparable, Comparable>() {
@SuppressWarnings("unchecked")
@Override
public boolean isTrue(Comparable a, Comparable... bs) {
if (bs.length != 1) {
throw new IllegalArgumentException("Should have 2 arguments");
}
return a.compareTo(bs[0]) <= 0;
}
@Override
public String toString() {
return " ≤ ";
}
};
@SuppressWarnings("rawtypes")
public static TestRelation GEQ = new TestRelation<Comparable, Comparable>() {
@SuppressWarnings("unchecked")
@Override
public boolean isTrue(Comparable a, Comparable... bs) {
if (bs.length != 1) {
throw new IllegalArgumentException("Should have 2 arguments");
}
return a.compareTo(bs[0]) >= 0;
}
@Override
public String toString() {
return "≥ ";
}
};
@SuppressWarnings("rawtypes")
public static TestRelation IDENTICAL = new TestRelation<Object, Object>() {
@Override
public boolean isTrue(Object a, Object... bs) {
for (Object b : bs) {
if (a != b) {
return false;
}
}
return true;
}
@Override
public String toString() {
return "is identical to";
}
};
@SuppressWarnings("rawtypes")
public static TestRelation CONTAINS_US = new TestRelation<UnicodeSet, Object>() {
@Override
public boolean isTrue(UnicodeSet a, Object... bs) {
for (Object b : bs) {
if (b instanceof UnicodeSet) {
if (!a.containsAll((UnicodeSet) b)) {
return false;
}
} else if (b instanceof Integer) {
if (!a.contains((Integer) b)) {
return false;
}
}
}
return true;
}
public String showFirst(UnicodeSet a) {
return show(a.toPattern(false));
}
public String showOther(UnicodeSet b) {
return show(b.toPattern(false));
}
@Override
public String toString() {
return "contains";
}
};
private String sourceLocationPlus() {
// Walk up the stack to the first call site outside this file
StackTraceElement[] st = new Throwable().getStackTrace();
for (int i = 0; i < st.length; ++i) {
if (!"TestFmwkPlus.java".equals(st[i].getFileName())) {
return "File " + st[i].getFileName() + ", Line "
+ st[i].getLineNumber();
}
}
throw new InternalError();
}
public static void main(String[] args) {
new TestFmwkPlus().run(args);
}
public void TestTest() {
Set<String> containerA = new HashSet<String>();
String stringA = "a";
String stringA2 = "ab".substring(0, 1);
containerA.add(stringA);
String stringB = "b";
logln("These work");
assertNotEquals("should be different", stringA, stringB);
assertEquals("should be same", stringA, stringA2);
logln("These work, but the messages are not clear because you can't see the arguments");
assertTrue("should be contained", containerA.contains(stringA));
assertFalse("should not be contained", containerA.contains(stringB));
logln("These work, because you can see the arguments");
assertFalse(stringA, IDENTICAL, stringA2);
assertTrue(containerA, EMPTY);
assertTrue(containerA, CONTAINS, stringA);
assertFalse(containerA, CONTAINS, stringB);
assertTrue(containerA, new Or(CONTAINS, IDENTICAL), stringA);
assertFalse(containerA, new And(CONTAINS, IDENTICAL), stringA);
assertTrue(new UnicodeSet("[:L:]"), CONTAINS_US, 'a', new UnicodeSet(
"[ab]"));
assertTrue(3, LEQ, 4);
}
}