blob: 146d72dc38c02f0ee431eac8e7927bbe337d97cf [file] [log] [blame]
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
package quarks.samples.apps;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import org.junit.Test;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import quarks.function.Supplier;
/**
* Test Range.
*/
public class RangeTest {
private <T extends Comparable<?>> void testContains(Range<T> range, T v, Boolean expected) {
assertEquals("range"+range+".contains(range"+v+")", expected, range.contains(v));
}
private <T extends Comparable<?>> void testToString(Range<T> range, String expected) {
assertEquals("range.toString()", expected, range.toString());
}
private <T extends Comparable<?>> void testValueOf(String str, Class<T> clazz, Range<T> expected) {
assertEquals("Range.valueOf("+clazz.getSimpleName()+")",
Range.valueOf(str, clazz), expected);
}
private <T extends Comparable<?>> void testEquals(Range<T> r1, Range<T> r2, Boolean expected) {
assertEquals("range"+r1+".equals(range"+r2+")", expected, r1.equals(r2));
}
private <T extends Comparable<?>> void testHashCode(Range<T> range, int hashCode, Boolean expected) {
if (expected)
assertEquals("range"+range+".hashCode()", hashCode, range.hashCode());
else
assertNotEquals("range"+range+".hashCode()", hashCode, range.hashCode());
}
private <T extends Comparable<?>> void testSupportedType(Supplier<Range<T>> range, Class<T> clazz, Boolean expected) {
boolean act;
try {
range.get();
act = true;
}
catch (IllegalArgumentException e) {
act = false;
}
assertEquals("supported type "+clazz.toString(), expected, act);
}
private <T extends Comparable<?>> void testJson(Range<T> r1, Type typeOfT) {
String json = new Gson().toJson(r1);
Range<T> r2 = new Gson().fromJson(json, typeOfT);
assertEquals("json="+json+" typeOfT="+typeOfT, r1, r2);
}
@Test
public void testSupportedTypes() {
testSupportedType(() -> Range.closed("a", "f"), String.class, false);
testSupportedType(() -> Range.closed('a', 'f'), Character.class, false);
testSupportedType(() -> Range.closed(1, 10), Integer.class, true);
testSupportedType(() -> Range.closed((short)1, (short)10), Short.class, true);
testSupportedType(() -> Range.closed((byte)1, (byte)10), Byte.class, true);
testSupportedType(() -> Range.closed(1L, 10L), Long.class, true);
testSupportedType(() -> Range.closed(1f, 10f), Float.class, true);
testSupportedType(() -> Range.closed(1d, 10d), Double.class, true);
testSupportedType(() -> Range.closed(BigInteger.valueOf(1), BigInteger.valueOf(10)), BigInteger.class, true);
testSupportedType(() -> Range.closed(BigDecimal.valueOf(1), BigDecimal.valueOf(10)), BigDecimal.class, true);
}
@Test
public void testContainsOpen() {
testContains(Range.open(2,4), 1, false);
testContains(Range.open(2,4), 2, false);
testContains(Range.open(2,4), 3, true);
testContains(Range.open(2,4), 4, false);
testContains(Range.open(2,4), 5, false);
}
@Test
public void testContainsClosed() {
testContains(Range.closed(2,4), 1, false);
testContains(Range.closed(2,4), 2, true);
testContains(Range.closed(2,4), 3, true);
testContains(Range.closed(2,4), 4, true);
testContains(Range.closed(2,4), 5, false);
}
@Test
public void testContainsOpenClosed() {
testContains(Range.openClosed(2,4), 1, false);
testContains(Range.openClosed(2,4), 2, false);
testContains(Range.openClosed(2,4), 3, true);
testContains(Range.openClosed(2,4), 4, true);
testContains(Range.openClosed(2,4), 5, false);
}
@Test
public void testContainsClosedOpen() {
testContains(Range.closedOpen(2,4), 1, false);
testContains(Range.closedOpen(2,4), 2, true);
testContains(Range.closedOpen(2,4), 3, true);
testContains(Range.closedOpen(2,4), 4, false);
testContains(Range.closedOpen(2,4), 5, false);
}
@Test
public void testContainsGreaterThan() {
testContains(Range.greaterThan(2), 1, false);
testContains(Range.greaterThan(2), 2, false);
testContains(Range.greaterThan(2), 3, true);
}
@Test
public void testContainsAtLeast() {
testContains(Range.atLeast(2), 1, false);
testContains(Range.atLeast(2), 2, true);
testContains(Range.atLeast(2), 3, true);
}
@Test
public void testContainsLessThan() {
testContains(Range.lessThan(2), 1, true);
testContains(Range.lessThan(2), 2, false);
testContains(Range.lessThan(2), 3, false);
}
@Test
public void testContainsAtMost() {
testContains(Range.atMost(2), 1, true);
testContains(Range.atMost(2), 2, true);
testContains(Range.atMost(2), 3, false);
}
@Test
public void testContainsSingleton() {
testContains(Range.singleton(2), 1, false);
testContains(Range.singleton(2), 2, true);
testContains(Range.singleton(2), 3, false);
}
@Test
public void testEquals() {
testEquals(Range.closed(2,4), Range.closed(2,4), true);
testEquals(Range.closed(2,4), Range.closed(2,3), false);
testEquals(Range.closed(3,4), Range.closed(2,4), false);
testEquals(Range.atMost(2), Range.atMost(2), true);
testEquals(Range.atMost(2), Range.atMost(3), false);
testEquals(Range.atLeast(2), Range.atLeast(2), true);
testEquals(Range.atLeast(2), Range.atLeast(3), false);
testEquals(Range.closed(2,2), Range.singleton(2), true);
}
@Test
public void testHashCode() {
testHashCode(Range.atMost(2), Range.atMost(2).hashCode(), true);
testHashCode(Range.atMost(2), 0, false);
testHashCode(Range.atMost(2), Range.atMost(3).hashCode(), false);
testHashCode(Range.atLeast(2), Range.atMost(2).hashCode(), false);
}
@Test
public void testToString() {
testToString(Range.open(2,4), "(2..4)");
testToString(Range.closed(2,4), "[2..4]");
testToString(Range.openClosed(2,4), "(2..4]");
testToString(Range.closedOpen(2,4), "[2..4)");
testToString(Range.greaterThan(2), "(2..*)");
testToString(Range.atLeast(2), "[2..*)");
testToString(Range.lessThan(2), "(*..2)");
testToString(Range.atMost(2), "(*..2]");
}
@Test
public void testValueOf() {
testValueOf("(2..4)", Integer.class, Range.open(2, 4));
testValueOf("[2..4]", Integer.class, Range.closed(2, 4));
testValueOf("(2..4]", Integer.class, Range.openClosed(2, 4));
testValueOf("[2..4)", Integer.class, Range.closedOpen(2, 4));
testValueOf("(2..*)", Integer.class, Range.greaterThan(2));
testValueOf("[2..*)", Integer.class, Range.atLeast(2));
testValueOf("(*..2)", Integer.class, Range.lessThan(2));
testValueOf("(*..2]", Integer.class, Range.atMost(2));
}
@Test
public void testContainsOtherByte() {
testContains(Range.open((byte)2,(byte)4), (byte)1, false);
testContains(Range.open((byte)2,(byte)4), (byte)2, false);
testContains(Range.open((byte)2,(byte)4), (byte)3, true);
testContains(Range.open((byte)2,(byte)4), (byte)4, false);
testContains(Range.open((byte)2,(byte)4), (byte)5, false);
}
@Test
public void testContainsOtherShort() {
testContains(Range.open((short)2,(short)4), (short)1, false);
testContains(Range.open((short)2,(short)4), (short)2, false);
testContains(Range.open((short)2,(short)4), (short)3, true);
testContains(Range.open((short)2,(short)4), (short)4, false);
testContains(Range.open((short)2,(short)4), (short)5, false);
}
@Test
public void testContainsOtherLong() {
testContains(Range.open(2L,4L), 1L, false);
testContains(Range.open(2L,4L), 2L, false);
testContains(Range.open(2L,4L), 3L, true);
testContains(Range.open(2L,4L), 4L, false);
testContains(Range.open(2L,4L), 5L, false);
}
@Test
public void testContainsOtherFloat() {
testContains(Range.open(2f,4f), 1f, false);
testContains(Range.open(2f,4f), 2f, false);
testContains(Range.open(2f,4f), 2.001f, true);
testContains(Range.open(2f,4f), 3.999f, true);
testContains(Range.open(2f,4f), 4f, false);
testContains(Range.open(2f,4f), 5f, false);
}
@Test
public void testContainsOtherDouble() {
testContains(Range.open(2d,4d), 1d, false);
testContains(Range.open(2d,4d), 2d, false);
testContains(Range.open(2d,4d), 2.001d, true);
testContains(Range.open(2d,4d), 3.999d, true);
testContains(Range.open(2d,4d), 4d, false);
testContains(Range.open(2d,4d), 5d, false);
}
@Test
public void testContainsOtherBigInteger() {
testContains(Range.open(BigInteger.valueOf(2),BigInteger.valueOf(4)), BigInteger.valueOf(1), false);
testContains(Range.open(BigInteger.valueOf(2),BigInteger.valueOf(4)), BigInteger.valueOf(2), false);
testContains(Range.open(BigInteger.valueOf(2),BigInteger.valueOf(4)), BigInteger.valueOf(3), true);
testContains(Range.open(BigInteger.valueOf(2),BigInteger.valueOf(4)), BigInteger.valueOf(4), false);
testContains(Range.open(BigInteger.valueOf(2),BigInteger.valueOf(4)), BigInteger.valueOf(5), false);
}
@Test
public void testContainsOtherBigDecimal() {
testContains(Range.open(new BigDecimal(2),new BigDecimal(4)), new BigDecimal(1), false);
testContains(Range.open(new BigDecimal(2),new BigDecimal(4)), new BigDecimal(2), false);
testContains(Range.open(new BigDecimal(2),new BigDecimal(4)), new BigDecimal(2.001), true);
testContains(Range.open(new BigDecimal(2),new BigDecimal(4)), new BigDecimal(3.999), true);
testContains(Range.open(new BigDecimal(2),new BigDecimal(4)), new BigDecimal(4), false);
testContains(Range.open(new BigDecimal(2),new BigDecimal(4)), new BigDecimal(5), false);
}
// @Test
// public void testContainsOtherString() {
// testContains(Range.open("b","d"), "a", false);
// testContains(Range.open("b","d"), "b", false);
// testContains(Range.open("b","d"), "bc", true);
// testContains(Range.open("b","d"), "c", true);
// testContains(Range.open("b","d"), "cd", true);
// testContains(Range.open("b","d"), "d", false);
// testContains(Range.open("b","d"), "de", false);
// testContains(Range.open("b","d"), "e", false);
// }
// @Test
// public void testContainsOtherCharacter() {
// testContains(Range.open('b','d'), 'a', false);
// testContains(Range.open('b','d'), 'b', false);
// testContains(Range.open('b','d'), 'c', true);
// testContains(Range.open('b','d'), 'd', false);
// testContains(Range.open('b','d'), 'e', false);
// }
@Test
public void testValueOfOther() {
testValueOf("(2..4)", Short.class, Range.open((short)2, (short)4));
testValueOf("(2..4)", Byte.class, Range.open((byte)2, (byte)4));
testValueOf("(2..4)", Long.class, Range.open(2L, 4L));
testValueOf("(2.128..4.25)", Float.class, Range.open(2.128f, 4.25f));
testValueOf("(2.128..4.25)", Double.class, Range.open(2.128d, 4.25d));
testValueOf("(2..4)", BigInteger.class, Range.open(BigInteger.valueOf(2), BigInteger.valueOf(4)));
testValueOf("(2.5..4.25)", BigDecimal.class, Range.open(new BigDecimal(2.5), new BigDecimal(4.25)));
// testValueOf("(ab..fg)", String.class, Range.open("ab", "fg"));
// testValueOf("(ab..c..fg)", String.class, Range.open("ab..c", "fg")); // yikes
// testValueOf("(a..f)", Character.class, Range.open('a', 'f'));
}
@Test
public void testJsonAllTypes() {
testJson(Range.closed(1, 10), new TypeToken<Range<Integer>>(){}.getType());
testJson(Range.closed((short)1, (short)10), new TypeToken<Range<Short>>(){}.getType());
testJson(Range.closed((byte)1, (byte)10), new TypeToken<Range<Byte>>(){}.getType());
testJson(Range.closed(1L, 10L), new TypeToken<Range<Long>>(){}.getType());
testJson(Range.closed(1f, 10f), new TypeToken<Range<Float>>(){}.getType());
testJson(Range.closed(1d, 10d), new TypeToken<Range<Double>>(){}.getType());
testJson(Range.closed(BigInteger.valueOf(1), BigInteger.valueOf(10)), new TypeToken<Range<BigInteger>>(){}.getType());
testJson(Range.closed(BigDecimal.valueOf(1), BigDecimal.valueOf(10)), new TypeToken<Range<BigDecimal>>(){}.getType());
// testJson(Range("ab", "fg"), new TypeToken<Range<String>>(){}.getType());
// testJson(Range("ab..c", "fg"), new TypeToken<Range<String>>(){}.getType());
// testJson(Range('a', 'f'), new TypeToken<Range<Character>>(){}.getType());
}
}