package com.googlecode.totallylazy.numbers; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.math.BigInteger; import org.junit.Test; import com.googlecode.totallylazy.matchers.NumberMatcher; public class ShortOperatorsTest { final short zero = 0; final short one = 1; final short two = 2; final short minusOne = -1; final short minusTwo = -2; final ShortOperators ops = ShortOperators.Instance; Number nr; Short sr; Ratio rr; @Test public void testNegateNormal() { nr = ops.negate(one); assertEquals(Short.class, nr.getClass()); assertThat(nr, NumberMatcher.is(minusOne)); } @Test public void testNegateZero() { nr = ops.negate(zero); assertEquals(Short.class, nr.getClass()); assertThat(nr, NumberMatcher.is(0)); } @Test public void testNegateMax() { nr = ops.negate(Short.MAX_VALUE); assertEquals(Short.class, nr.getClass()); assertThat(nr, NumberMatcher.is((short) (-Short.MAX_VALUE))); } @Test public void testNegateMin() { nr = ops.negate(Short.MIN_VALUE); assertEquals(Integer.class, nr.getClass()); assertThat(nr, NumberMatcher.is(-Short.MIN_VALUE)); } @Test public void testIncrementNormal() { nr = ops.increment(one); assertEquals(Short.class, nr.getClass()); assertThat(nr, NumberMatcher.is(two)); } @Test public void testIncrementZero() { nr = ops.increment(zero); assertEquals(Short.class, nr.getClass()); assertThat(nr, NumberMatcher.is(one)); } @Test public void testIncrementMin() { nr = ops.increment(Short.MIN_VALUE); assertEquals(Short.class, nr.getClass()); assertThat(nr, NumberMatcher.is(Short.MIN_VALUE + 1)); } @Test public void testIncrementMax() { nr = ops.increment(Short.MAX_VALUE); assertEquals(Integer.class, nr.getClass()); assertThat(nr, NumberMatcher.is(Short.MAX_VALUE + 1)); } @Test public void testDecrementNormal() { nr = ops.decrement(one); assertEquals(Short.class, nr.getClass()); assertThat(nr, NumberMatcher.is(zero)); } @Test public void testDecrementZero() { nr = ops.decrement(zero); assertEquals(Short.class, nr.getClass()); assertThat(nr, NumberMatcher.is(minusOne)); } @Test public void testDecrementMin() { nr = ops.decrement(Short.MIN_VALUE); assertEquals(Integer.class, nr.getClass()); assertThat(nr, NumberMatcher.is(Short.MIN_VALUE - 1)); } @Test public void testDecrementMax() { nr = ops.decrement(Short.MAX_VALUE); assertEquals(Short.class, nr.getClass()); assertThat(nr, NumberMatcher.is(Short.MAX_VALUE - 1)); } @Test public void testIsZero() { assertTrue(ops.isZero(zero)); assertFalse(ops.isZero(one)); assertFalse(ops.isZero(Short.MAX_VALUE)); } @Test public void testIsPositive() { assertTrue(ops.isPositive(one)); assertFalse(ops.isPositive(zero)); assertFalse(ops.isPositive(minusOne)); assertTrue(ops.isPositive(Short.MAX_VALUE)); assertFalse(ops.isPositive(Short.MIN_VALUE)); } @Test public void testIsNegative() { assertFalse(ops.isNegative(one)); assertFalse(ops.isNegative(zero)); assertTrue(ops.isNegative(minusOne)); assertFalse(ops.isNegative(Short.MAX_VALUE)); assertTrue(ops.isNegative(Short.MIN_VALUE)); } @Test public void testEqualTo() { assertTrue(ops.equalTo(one, (short) 1)); assertTrue(ops.equalTo(two, (short) 2)); assertFalse(ops.equalTo(zero, (short) 1)); } @Test public void testLessThan() { assertTrue(ops.lessThan(zero, one)); assertTrue(ops.lessThan(one, two)); assertFalse(ops.lessThan(two, one)); assertFalse(ops.lessThan(zero, zero)); assertTrue(ops.lessThan(Short.MIN_VALUE, zero)); assertFalse(ops.lessThan(Short.MAX_VALUE, zero)); } @Test public void testAddNormal() { nr = ops.add(one, one); assertEquals(Short.class, nr.getClass()); assertEquals(two, nr); } @Test public void testAddZero() { nr = ops.add(zero, one); assertEquals(Short.class, nr.getClass()); assertEquals(one, nr); } @Test public void testAddOverflowMax() { nr = ops.add(Short.MAX_VALUE, Short.MAX_VALUE); assertEquals(Integer.class, nr.getClass()); assertEquals(Short.MAX_VALUE + Short.MAX_VALUE, nr); } @Test public void testAddOverflowMin() { nr = ops.add(Short.MIN_VALUE, Short.MIN_VALUE); assertEquals(Integer.class, nr.getClass()); assertEquals(Short.MIN_VALUE + Short.MIN_VALUE, nr); } @Test public void testMultiplyNormal() { nr = ops.multiply(one, two); assertEquals(Short.class, nr.getClass()); assertEquals(two, nr); } @Test public void testMultiplyZero() { nr = ops.multiply(zero, one); assertEquals(Short.class, nr.getClass()); assertEquals(zero, nr); } @Test public void testMultiplyOverflow0() { nr = ops.multiply(Short.MAX_VALUE, Short.MAX_VALUE); assertEquals(Integer.class, nr.getClass()); assertEquals(Short.MAX_VALUE * Short.MAX_VALUE, nr); } @Test public void testMultiplyOverflow1() { nr = ops.multiply(Short.MAX_VALUE, Short.MIN_VALUE); assertEquals(Integer.class, nr.getClass()); assertEquals(Short.MAX_VALUE * Short.MIN_VALUE, nr); } @Test public void testMultiplyOverflow2() { nr = ops.multiply(Short.MIN_VALUE, Short.MIN_VALUE); assertEquals(Integer.class, nr.getClass()); assertEquals(Short.MIN_VALUE * Short.MIN_VALUE, nr); } @Test public void testDivide() { nr = ops.divide(one, two); final Ratio expected = new Ratio(BigInteger.valueOf(one), BigInteger.valueOf(two)); assertEquals(Ratio.class, nr.getClass()); assertEquals(expected, nr); } @Test public void testQuotientNormal() { nr = ops.quotient(one, two); assertEquals(Short.class, nr.getClass()); assertEquals(zero, nr); } @Test(expected = ArithmeticException.class) public void testQuotientDivideByZero() { ops.quotient(one, zero); fail("Should throw ArithmeticException."); } @Test public void testRemainderNormal() { nr = ops.remainder(one, two); assertEquals(Short.class, nr.getClass()); assertEquals(one, nr); } @Test(expected = ArithmeticException.class) public void testRemainderDivideByZero() { ops.remainder(one, zero); fail("Should throw ArithmeticException."); } @Test public void testForClass() { assertEquals(Short.class, ops.forClass()); } @Test public void testPriority() { assertThat(ops.priority(), NumberMatcher.lessThan(IntegerOperators.Instance.priority())); } }