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