/* * 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 groovy.lang; import junit.framework.TestCase; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; /** * Provides unit tests for the <code>ObjectRange</code> class. */ public class ObjectRangeTest extends TestCase { public void testSize() { Range r = createRange(0, 10); assertEquals("Size of " + r, 11, r.size()); r = createRange(0, 1); assertEquals("Size of " + r, 2, r.size()); r = createRange(1, 0); assertEquals("Size of " + r, 2, r.size()); r = createRange(0, 0); assertEquals("Size of " + r, 1, r.size()); r = createRange(new BigDecimal("2.1"), new BigDecimal("10.0")); assertEquals("Size of " + r, 8, r.size()); r = createRange(new BigDecimal("10"), new BigDecimal("2.1")); assertEquals("Size of " + r, 8, r.size()); r = createRange("a", "d"); assertEquals("Size of " + r, 4, r.size()); r = createRange("d", "a"); assertEquals("Size of " + r, 4, r.size()); r = createRange("aa1", "aa4"); assertEquals("Size of " + r, 4, r.size()); r = createRange("aa4", "aa1"); assertEquals("Size of " + r, 4, r.size()); r = createRange('7', ';'); assertEquals(5, r.size()); // '7', '8', '9', ':', ';' Range mixed = createRange('7', ';'); assertEquals(5, mixed.size()); mixed = createRange('7', 59.5); assertEquals(5, mixed.size()); mixed = createRange('7', 59); assertEquals(5, mixed.size()); mixed = createRange('7', new BigInteger("59")); assertEquals(5, mixed.size()); mixed = createRange('7', new BigDecimal("59.5")); assertEquals(5, mixed.size()); // integer overflow cases assertEquals(Integer.MAX_VALUE, new ObjectRange(0L, Integer.MAX_VALUE).size()); assertEquals(Integer.MAX_VALUE, new ObjectRange(Long.MIN_VALUE, Long.MAX_VALUE).size()); assertEquals(Integer.MAX_VALUE, new ObjectRange(new BigInteger("-10"), new BigInteger(Long.toString((long) Integer.MAX_VALUE) + 1L)).size()); } public void testProperties() { Range r = createRange(0, 10); assertEquals("from", 0, r.getFrom()); assertEquals("to", 10, r.getTo()); r = createRange(10, 0); assertEquals("from", 0, r.getFrom()); assertEquals("to", 10, r.getTo()); } public void testGet() { Range r = createRange(10, 20); for (int i = 0; i < 10; i++) { Integer value = (Integer) r.get(i); assertEquals("Item at index: " + i, i + 10, value.intValue()); } r = createRange(new BigDecimal("3.2"), new BigDecimal("9.9")); for (int i = 0; i < r.size(); i++) { BigDecimal value = (BigDecimal) r.get(i); assertEquals("Item at index: " + i, new BigDecimal("3.2").add(new BigDecimal("" + i)), value); } r = new ObjectRange(10, 20, false); for (int i = 0; i < 10; i++) { Integer value = (Integer) r.get(i); assertEquals("Item at index: " + i, i + 10, value.intValue()); } r = new ObjectRange(10, 20, true); for (int i = 0; i < 10; i++) { Integer value = (Integer) r.get(i); assertEquals("Item at index: " + i, 20 - i, value.intValue()); } } public void testNullForFromOrToIsIllegal() { Comparable dontcare = new Integer(0); try { new ObjectRange((Comparable)null, dontcare); fail("Should have thrown IllegalArgumentException"); } catch (IllegalArgumentException e) { // worked } } public void testGetOutOfRange() { Range r = createRange(1, 1); assertEquals("Item at index: 0", 1, r.get(0)); try { r.get(-1); fail("Should have thrown IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException e) { // worked } try { r.get(1); fail("Should have thrown IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException e) { // worked } r = createRange(10, 20); try { r.get(-1); fail("Should have thrown IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException e) { // worked } try { r.get(11); fail("Should have thrown IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException e) { // worked } r = createRange(new BigDecimal("-4.3"), new BigDecimal("1.4")); try { r.get(-1); fail("Should have thrown IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException e) { // worked } try { r.get(7); fail("Should have thrown IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException e) { // worked } } public void testMixedCreation() { try { createRange("aa", "a"); fail(); } catch (IllegalArgumentException e) { // pass } try { createRange("11", 11); fail(); } catch (IllegalArgumentException e) { // pass } try { createRange(11, "11"); fail(); } catch (IllegalArgumentException e) { // pass } Range mixed = createRange('7', 59.5); assertEquals(5, mixed.size()); assertEquals(Arrays.asList(55, 56, 57, 58, 59), mixed.step(1)); mixed = createRange('7', BigInteger.valueOf(59)); assertEquals(5, mixed.size()); assertEquals(Arrays.asList(55, 56, 57, 58, 59), mixed.step(1)); } public void testContains() { Range r = createRange(10, 20); assertTrue("contains 11", r.contains(new Integer(11))); assertTrue("contains 10", r.contains(new Integer(10))); assertTrue("contains 19", r.contains(new Integer(19))); assertFalse("contains 9", r.contains(new Integer(9))); assertFalse("contains 21", r.contains(new Integer(21))); assertFalse("contains 100", r.contains(new Integer(100))); assertFalse("contains -1", r.contains(new Integer(-1))); r = createRange(new BigDecimal("2.1"), new BigDecimal("10.0")); assertTrue("contains 9.1", r.contains(new BigDecimal("9.1"))); assertFalse("contains 10.1", r.contains(new BigDecimal("10.1"))); assertFalse("contains 8.0", r.contains(new BigDecimal("8.0"))); assertTrue("containsWithinBounds 8.0", r.containsWithinBounds(new BigDecimal("8.0"))); assertTrue("containsWithinBounds 9.9999", r.containsWithinBounds(new BigDecimal("9.9999"))); assertTrue("containsWithinBounds 10.0", r.containsWithinBounds(new BigDecimal("10.0"))); assertFalse("containsWithinBounds 10.0001", r.containsWithinBounds(new BigDecimal("10.0001"))); } public void testContainsWithLikeNumbers() { Range r = new ObjectRange(new Integer(1), new Short((short)3)); assertTrue("contains 2", r.contains(new Integer(2))); r = new ObjectRange(new Float(1.0), new Double(3.0)); assertTrue("contains 2.0d", r.contains(new Double(2.0))); assertTrue("contains 2.0g", r.contains(new BigDecimal(2.0))); r = new ObjectRange(new BigDecimal(1.0), new BigDecimal(3.0)); assertTrue("contains 2.0d", r.contains(new Double(2.0))); assertTrue("contains 2.0f", r.contains(new Float(2.0))); } public void testContainsWithIncompatibleType() { Range r = new ObjectRange(new Integer(1), new Short((short)3)); assertFalse("shouldn't contain string", r.contains("String")); } public void testSubList() { Range r = createRange(10, 20); assertEquals("from", 10, r.getFrom()); assertEquals("to", 20, r.getTo()); assertEquals("size", 11, r.size()); List s = r.subList(2, 4); Range sr = (Range) s; assertEquals("from", 12, sr.getFrom()); assertEquals("to", 13, sr.getTo()); assertEquals("size", 2, sr.size()); s = r.subList(0, 11); sr = (Range) s; assertEquals("from", 10, sr.getFrom()); assertEquals("to", 20, sr.getTo()); assertEquals("size", 11, sr.size()); try { r.subList(-2, 4); fail(); } catch (IndexOutOfBoundsException e) { // pass } try { r.subList(5, 12); fail(); } catch (IndexOutOfBoundsException e) { // pass } r = createRange(new BigDecimal("0.5"), new BigDecimal("8.5")); assertEquals("size", 9, r.size()); s = r.subList(2, 5); sr = (Range) s; assertEquals("from", new BigDecimal("2.5"), sr.getFrom()); assertEquals("to", new BigDecimal("4.5"), sr.getTo()); assertTrue("contains 4.5", sr.contains(new BigDecimal("4.5"))); assertFalse("contains 5.5", sr.contains(new BigDecimal("5.5"))); assertEquals("size", 3, sr.size()); } public void testHashCodeAndEquals() { Range a = createRange(1, 11); Range b = createRange(1, 11); Range c = createRange(2, 11); assertEquals("hashcode", a.hashCode(), b.hashCode()); assertTrue("hashcode", a.hashCode() != c.hashCode()); assertEquals("a and b", a, b); assertFalse("a != c", a.equals(c)); } public void testIteratorException() { Iterator iter = createRange(1, 2).iterator(); iter.next(); iter.next(); try { iter.next(); fail("Should have thrown NoSuchElementException"); } catch(NoSuchElementException e) { } } public void testIteratorAndStep1() { Range r = createRange(5, 11); int i = 4; for (Iterator it = r.iterator(); it.hasNext();) { i++; assertEquals("equals to " + i, new Integer(i), (Integer) (it.next())); } assertEquals(11, i); i = 4; for (Iterator it = r.step(1).iterator(); it.hasNext();) { i++; assertEquals("equals to " + i, new Integer(i), (Integer) (it.next())); } assertEquals(11, i); r = createRange(new BigDecimal("5.0"), new BigDecimal("11.0")); BigDecimal one = new BigDecimal("1.0"); BigDecimal val = new BigDecimal("5.0"); for (Iterator it = r.iterator(); it.hasNext();) { assertEquals("equals to " + val, val, (BigDecimal) (it.next())); val = val.add(one); } assertEquals(11, i); val = new BigDecimal("5.0"); for (Iterator it = r.step(1).iterator(); it.hasNext();) { assertEquals("equals to " + val, val, (BigDecimal) (it.next())); val = val.add(one); } assertEquals(11, i); r = createRange(new Character('a'), new Character('z')); char valChar = 'a'; for (Iterator it = r.iterator(); it.hasNext();) { assertEquals("equals to " + valChar, valChar, ((Character) it.next()).charValue()); if (it.hasNext()) { valChar = (char) (((int) valChar) + 1); } } assertEquals('z', valChar); valChar = 'a'; for (Iterator it = r.step(1).iterator(); it.hasNext();) { assertEquals("equals to " + valChar, valChar, ((Character) it.next()).charValue()); if (it.hasNext()) { valChar = (char) (((int) valChar) + 1); } } assertEquals('z', valChar); } protected Range createRange(int from, int to) { return new ObjectRange(new Integer(from), new Integer(to)); } protected Range createRange(Comparable from, Comparable to) { return new ObjectRange(from, to); } protected void assertEquals(String msg, int expected, Object value) { assertEquals(msg, new Integer(expected), value); } }