1007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin/*
2007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin * Copyright (C) 2014 The Android Open Source Project
3007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin *
4007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin * you may not use this file except in compliance with the License.
6007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin * You may obtain a copy of the License at
7007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin *
8007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin *
10007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin * Unless required by applicable law or agreed to in writing, software
11007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin * See the License for the specific language governing permissions and
14007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin * limitations under the License.
15007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin */
16007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
17007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkinpackage com.android.mediaframeworktest.unit;
18007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
19007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkinimport android.test.suitebuilder.annotation.SmallTest;
20007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkinimport android.util.Range;
21007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkinimport android.util.Rational;
22007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
23007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin/**
24007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin * <pre>
25007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin * adb shell am instrument \
26007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin *      -e class 'com.android.mediaframeworktest.unit.RangeTest' \
27007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin *      -w com.android.mediaframeworktest/.MediaFrameworkUnitTestRunner
28007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin * </pre>
29007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin */
30007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkinpublic class RangeTest extends junit.framework.TestCase {
31007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
32007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    @SmallTest
33007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    public void testConstructor() {
34007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        // Trivial, same range
35007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        Range<Integer> intRange = new Range<Integer>(1, 1);
36007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
37007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertLower(intRange, 1);
38007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertUpper(intRange, 1);
39007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
40007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        // Different values in range
41007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        Range<Integer> intRange2 = new Range<Integer>(100, 200);
42007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertLower(intRange2, 100);
43007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertUpper(intRange2, 200);
44007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
45007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        Range<Float> floatRange = new Range<Float>(Float.NEGATIVE_INFINITY,
46007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin                Float.POSITIVE_INFINITY);
47007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertLower(floatRange, Float.NEGATIVE_INFINITY);
48007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertUpper(floatRange, Float.POSITIVE_INFINITY);
49007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    }
50007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
51007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    @SmallTest
52007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    public void testIllegalValues() {
53007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        // Test NPEs
54007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        try {
55007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            new Range<Integer>(null, null);
56007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            fail("Expected exception to be thrown for (null, null)");
57007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        } catch (NullPointerException e) {
58007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            // OK: both args are null
59007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        }
60007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
61007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        try {
62007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            new Range<Integer>(null, 0);
63007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            fail("Expected exception to be thrown for (null, 0)");
64007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        } catch (NullPointerException e) {
65007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            // OK: left arg is null
66007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        }
67007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
68007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        try {
69007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            new Range<Integer>(0, null);
70007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            fail("Expected exception to be thrown for (0, null)");
71007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        } catch (NullPointerException e) {
72007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            // OK: right arg is null
73007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        }
74007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
75007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        // Test IAEs
76007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
77007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        try {
78007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            new Range<Integer>(50, -50);
79007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            fail("Expected exception to be thrown for (50, -50)");
80007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        } catch (IllegalArgumentException e) {
81007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            // OK: 50 > -50 so it fails
82007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        }
83007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
84007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        try {
85007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            new Range<Float>(0.0f, Float.NEGATIVE_INFINITY);
86007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            fail("Expected exception to be thrown for (0.0f, -Infinity)");
87007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        } catch (IllegalArgumentException e) {
88007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            // OK: 0.0f is > NEGATIVE_INFINITY, so it fails
89007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        }
90007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    }
91007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
92007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    @SmallTest
93007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    public void testEquals() {
94007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        Range<Float> oneHalf = Range.create(1.0f, 2.0f);
95007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        Range<Float> oneHalf2 = new Range<Float>(1.0f, 2.0f);
96007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertEquals(oneHalf, oneHalf2);
97007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertHashCodeEquals(oneHalf, oneHalf2);
98007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
99007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        Range<Float> twoThirds = new Range<Float>(2.0f, 3.0f);
100007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        Range<Float> twoThirds2 = Range.create(2.0f, 3.0f);
101007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertEquals(twoThirds, twoThirds2);
102007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertHashCodeEquals(twoThirds, twoThirds2);
103007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
104007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        Range<Rational> negativeOneTenthPositiveOneTenth =
105007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin                new Range<Rational>(new Rational(-1, 10), new Rational(1, 10));
106007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        Range<Rational> negativeOneTenthPositiveOneTenth2 =
107007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin                Range.create(new Rational(-1, 10), new Rational(1, 10));
108007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertEquals(negativeOneTenthPositiveOneTenth, negativeOneTenthPositiveOneTenth2);
109007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertHashCodeEquals(negativeOneTenthPositiveOneTenth, negativeOneTenthPositiveOneTenth2);
110007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    }
111007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
112007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    @SmallTest
113007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    public void testInRange() {
114007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        Range<Integer> hundredOneTwo = Range.create(100, 200);
115007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
116007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertInRange(hundredOneTwo, 100);
117007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertInRange(hundredOneTwo, 200);
118007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertInRange(hundredOneTwo, 150);
119007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertOutOfRange(hundredOneTwo, 99);
120007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertOutOfRange(hundredOneTwo, 201);
121007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertOutOfRange(hundredOneTwo, 100000);
122007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
123007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        Range<Float> infinities = Range.create(Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY);
124007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
125007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertInRange(infinities, Float.NEGATIVE_INFINITY);
126007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertInRange(infinities, Float.POSITIVE_INFINITY);
127007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertInRange(infinities, 0.0f);
128007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertOutOfRange(infinities, Float.NaN);
129007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
130007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        Range<Rational> negativeOneTenthPositiveOneTenth =
131007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin                new Range<Rational>(new Rational(-1, 10), new Rational(1, 10));
132007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertInRange(negativeOneTenthPositiveOneTenth, new Rational(-1, 10));
133007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertInRange(negativeOneTenthPositiveOneTenth, new Rational(1, 10));
134007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertInRange(negativeOneTenthPositiveOneTenth, Rational.ZERO);
135007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertOutOfRange(negativeOneTenthPositiveOneTenth, new Rational(-100, 1));
136007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertOutOfRange(negativeOneTenthPositiveOneTenth, new Rational(100, 1));
137007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    }
138007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
139007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    private static <T extends Comparable<? super T>> void assertInRange(Range<T> object, T needle) {
140b1a236b85fa8f3f46e3f6b76a7bf6f72faf9ee5dLajos Molnar        assertAction("in-range", object, needle, true, object.contains(needle));
141007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    }
142007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
143007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    private static <T extends Comparable<? super T>> void assertOutOfRange(Range<T> object,
144007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            T needle) {
145b1a236b85fa8f3f46e3f6b76a7bf6f72faf9ee5dLajos Molnar        assertAction("out-of-range", object, needle, false, object.contains(needle));
146007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    }
147007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
148007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    private static <T extends Comparable<? super T>> void assertUpper(Range<T> object, T expected) {
149007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertAction("upper", object, expected, object.getUpper());
150007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    }
151007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
152007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    private static <T extends Comparable<? super T>> void assertLower(Range<T> object, T expected) {
153007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertAction("lower", object, expected, object.getLower());
154007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    }
155007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
156007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    private static <T, T2> void assertAction(String action, T object, T2 expected,
157007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            T2 actual) {
158007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertEquals("Expected " + object + " " + action + " to be ",
159007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin                expected, actual);
160007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    }
161007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
162007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    private static <T, T2> void assertAction(String action, T object, T2 needle, boolean expected,
163007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            boolean actual) {
164007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        String expectedMessage = expected ? action : ("not " + action);
165007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertEquals("Expected " + needle + " to be " + expectedMessage + " of " + object,
166007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin                expected, actual);
167007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    }
168007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin
169007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    private static <T extends Comparable<? super T>> void assertHashCodeEquals(
170007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin            Range<T> left, Range<T> right) {
171007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin        assertEquals("Left hash code for " + left +
172007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin                " expected to be equal to right hash code for " + right,
173007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin                left.hashCode(), right.hashCode());
174007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin    }
175007bfb14d2d720cdd699cfbb36ce206246901cefIgor Murashkin}
176