package org.dcache.util; import org.junit.Test; import static org.dcache.util.MathUtils.*; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; public class MathUtilsTests { @Test public void testAbsModulo5() { assertEquals( 1, absModulo(-6, 5)); assertEquals( 0, absModulo(-5, 5)); assertEquals( 4, absModulo(-4, 5)); assertEquals( 3, absModulo(-3, 5)); assertEquals( 2, absModulo(-2, 5)); assertEquals( 1, absModulo(-1, 5)); assertEquals( 0, absModulo(0, 5)); assertEquals( 1, absModulo(1, 5)); assertEquals( 2, absModulo(2, 5)); assertEquals( 3, absModulo(3, 5)); assertEquals( 4, absModulo(4, 5)); assertEquals( 0, absModulo(5, 5)); assertEquals( 1, absModulo(6, 5)); } @Test public void testAbsModulo3() { assertEquals( 0, absModulo(-6, 3)); assertEquals( 2, absModulo(-5, 3)); assertEquals( 1, absModulo(-4, 3)); assertEquals( 0, absModulo(-3, 3)); assertEquals( 2, absModulo(-2, 3)); assertEquals( 1, absModulo(-1, 3)); assertEquals( 0, absModulo(0, 3)); assertEquals( 1, absModulo(1, 3)); assertEquals( 2, absModulo(2, 3)); assertEquals( 0, absModulo(3, 3)); assertEquals( 1, absModulo(4, 3)); assertEquals( 2, absModulo(5, 3)); assertEquals( 0, absModulo(6, 3)); } @Test public void testMathAbsModuloSmallestNumber() { int expected = (int)(Math.abs((long)Integer.MIN_VALUE) % 11); assertEquals(expected, absModulo(Integer.MIN_VALUE, 11)); expected = (int)(Math.abs((long)Integer.MIN_VALUE) % 19); assertEquals(expected, absModulo(Integer.MIN_VALUE, 19)); expected = (int)(Math.abs((long)Integer.MIN_VALUE) % 31); assertEquals(expected, absModulo(Integer.MIN_VALUE, 31)); } @Test public void testMathAbsModuloLargestNumber() { int expected = (int)(Math.abs((long)Integer.MAX_VALUE) % 11); assertEquals(expected, absModulo(Integer.MAX_VALUE, 11)); expected = (int)(Math.abs((long)Integer.MAX_VALUE) % 19); assertEquals(expected, absModulo(Integer.MAX_VALUE, 19)); expected = (int)(Math.abs((long)Integer.MAX_VALUE) % 31); assertEquals(expected, absModulo(Integer.MAX_VALUE, 31)); } @Test public void testMathAbsModuloMaxMax() { assertEquals(0, absModulo(Integer.MAX_VALUE, Integer.MAX_VALUE)); } @Test public void testMathAbsModuloMinMax() { assertEquals(1, absModulo(Integer.MIN_VALUE, Integer.MAX_VALUE)); } @Test public void testAddWithInfinity() { assertThat(addWithInfinity(0L, 0L), is(0L)); assertThat(addWithInfinity(0L, Long.MAX_VALUE), is(Long.MAX_VALUE)); assertThat(addWithInfinity(5L, Long.MAX_VALUE), is(Long.MAX_VALUE)); assertThat(addWithInfinity(-5L, Long.MAX_VALUE), is(Long.MAX_VALUE)); assertThat(addWithInfinity(Long.MAX_VALUE, 0), is(Long.MAX_VALUE)); assertThat(addWithInfinity(Long.MAX_VALUE, 5), is(Long.MAX_VALUE)); assertThat(addWithInfinity(Long.MAX_VALUE, -5), is(Long.MAX_VALUE)); assertThat(addWithInfinity(Long.MAX_VALUE, Long.MAX_VALUE), is(Long.MAX_VALUE)); assertThat(addWithInfinity(0L, Long.MIN_VALUE), is(Long.MIN_VALUE)); assertThat(addWithInfinity(5L, Long.MIN_VALUE), is(Long.MIN_VALUE)); assertThat(addWithInfinity(-5L, Long.MIN_VALUE), is(Long.MIN_VALUE)); assertThat(addWithInfinity(Long.MIN_VALUE, 0), is(Long.MIN_VALUE)); assertThat(addWithInfinity(Long.MIN_VALUE, 5), is(Long.MIN_VALUE)); assertThat(addWithInfinity(Long.MIN_VALUE, -5), is(Long.MIN_VALUE)); assertThat(addWithInfinity(Long.MIN_VALUE, Long.MIN_VALUE), is(Long.MIN_VALUE)); assertThat(addWithInfinity(10L, 20L), is(30L)); } @Test public void testAddWithInfinityOverflow() { assertThat(addWithInfinity(Long.MAX_VALUE / 2 + 100, Long.MAX_VALUE / 2 + 100), is(Long.MAX_VALUE)); } @Test public void testAddWithInfinityUnderflow() { assertThat(addWithInfinity(-Long.MAX_VALUE / 2 - 100, -Long.MAX_VALUE / 2 - 100), is(Long.MIN_VALUE)); } @Test(expected=ArithmeticException.class) public void testAddWithInfinityMaxMin() { addWithInfinity(Long.MAX_VALUE, Long.MIN_VALUE); } @Test(expected=ArithmeticException.class) public void testAddWithInfinityMinMax() { addWithInfinity(Long.MIN_VALUE, Long.MAX_VALUE); } @Test public void testSubWithInfinity() { assertThat(subWithInfinity(0L, 0L), is(0L)); assertThat(subWithInfinity(0L, Long.MAX_VALUE), is(Long.MIN_VALUE)); assertThat(subWithInfinity(5L, Long.MAX_VALUE), is(Long.MIN_VALUE)); assertThat(subWithInfinity(-5L, Long.MAX_VALUE), is(Long.MIN_VALUE)); assertThat(subWithInfinity(Long.MAX_VALUE, 0), is(Long.MAX_VALUE)); assertThat(subWithInfinity(Long.MAX_VALUE, 5), is(Long.MAX_VALUE)); assertThat(subWithInfinity(Long.MAX_VALUE, -5), is(Long.MAX_VALUE)); assertThat(subWithInfinity(Long.MAX_VALUE, Long.MIN_VALUE), is(Long.MAX_VALUE)); assertThat(subWithInfinity(0L, Long.MIN_VALUE), is(Long.MAX_VALUE)); assertThat(subWithInfinity(5L, Long.MIN_VALUE), is(Long.MAX_VALUE)); assertThat(subWithInfinity(-5L, Long.MIN_VALUE), is(Long.MAX_VALUE)); assertThat(subWithInfinity(Long.MIN_VALUE, 0), is(Long.MIN_VALUE)); assertThat(subWithInfinity(Long.MIN_VALUE, 5), is(Long.MIN_VALUE)); assertThat(subWithInfinity(Long.MIN_VALUE, -5), is(Long.MIN_VALUE)); assertThat(subWithInfinity(Long.MIN_VALUE, Long.MAX_VALUE), is(Long.MIN_VALUE)); assertThat(subWithInfinity(10L, 20L), is(-10L)); } @Test public void testSubWithInfinityUnderflow() { assertThat(subWithInfinity(-Long.MAX_VALUE / 2 - 100, Long.MAX_VALUE / 2 + 100), is(Long.MIN_VALUE)); } @Test public void testSubWithInfinityOverlow() { assertThat(subWithInfinity(Long.MAX_VALUE / 2 + 100, -Long.MAX_VALUE / 2 - 100), is(Long.MAX_VALUE)); } @Test(expected=ArithmeticException.class) public void testSubWithInfinityMaxMax() { subWithInfinity(Long.MAX_VALUE, Long.MAX_VALUE); } @Test(expected=ArithmeticException.class) public void testSubWithInfinityMinMin() { subWithInfinity(Long.MIN_VALUE, Long.MIN_VALUE); } }