package com.supaham.commons.relatives;
import org.junit.Assert;
import org.junit.Test;
import java.time.Duration;
public class RelativeDurationTest {
public static final Duration ONE = Duration.ofSeconds(1);
public static final Duration TWO = Duration.ofSeconds(2);
@Test
public void testDouble() throws Exception {
long millis = 20_000L;
Duration duration = Duration.ofMillis(millis);
RelativeDuration relative = RelativeDuration.from(ArithmeticOperator.ADDITION, duration);
Assert.assertTrue(duration.equals(relative.apply(null)));
Assert.assertTrue(duration.plusSeconds(1).equals(relative.apply(ONE)));
relative = RelativeDuration.from(ArithmeticOperator.SUBTRACTION, duration);
Assert.assertTrue(duration.minusSeconds(1).equals(relative.apply(ONE)));
relative = RelativeDuration.from(ArithmeticOperator.MULTIPLICATION, duration);
Assert.assertTrue(duration.multipliedBy(2).equals(relative.apply(TWO)));
relative = RelativeDuration.from(ArithmeticOperator.DIVISION, duration);
Assert.assertTrue(duration.dividedBy(2).equals(relative.apply(TWO)));
relative = RelativeDuration.from(ArithmeticOperator.MODULUS, duration);
Assert.assertTrue(Duration.ofMillis(millis % 2).equals(relative.apply(TWO)));
relative = RelativeDuration.from(ArithmeticOperator.POWER, duration);
Assert.assertTrue(Duration.ofSeconds(400).equals(relative.apply(TWO)));
}
@Test
public void testEqualsAndHashCode() throws Exception {
RelativeDuration first = RelativeDuration.from(ArithmeticOperator.ADDITION, ONE);
RelativeDuration second = RelativeDuration.from(ArithmeticOperator.ADDITION, ONE);
RelativeDuration third = RelativeDuration.from(ArithmeticOperator.SUBTRACTION, ONE);
Assert.assertEquals(first, second);
Assert.assertNotEquals(first, third);
Assert.assertNotEquals(second, third);
Assert.assertEquals(first.hashCode(), second.hashCode());
Assert.assertNotEquals(first.hashCode(), third.hashCode());
Assert.assertNotEquals(second.hashCode(), third.hashCode());
}
@Test
public void testSerialization() throws Exception {
RelativeDuration add = RelativeDuration.from(ArithmeticOperator.ADDITION, ONE);
RelativeDuration subtract = RelativeDuration.from(ArithmeticOperator.SUBTRACTION, ONE);
RelativeDuration multiplication = RelativeDuration.from(ArithmeticOperator.MULTIPLICATION, ONE);
RelativeDuration division = RelativeDuration.from(ArithmeticOperator.DIVISION, ONE);
RelativeDuration modulus = RelativeDuration.from(ArithmeticOperator.MODULUS, ONE);
RelativeDuration power = RelativeDuration.from(ArithmeticOperator.POWER, ONE);
// RelativeDuration serializes ADDITION with nothing but the number
Assert.assertEquals("~1s", add.toString());
Assert.assertEquals("~-1s", subtract.toString());
Assert.assertEquals("~*1s", multiplication.toString());
Assert.assertEquals("~/1s", division.toString());
Assert.assertEquals("~%1s", modulus.toString());
Assert.assertEquals("~^1s", power.toString());
}
@Test
public void testDeserialization() throws Exception {
RelativeDuration add = RelativeDuration.from(ArithmeticOperator.ADDITION, ONE);
RelativeDuration subtract = RelativeDuration.from(ArithmeticOperator.ADDITION, ONE.negated());
RelativeDuration multiplication = RelativeDuration.from(ArithmeticOperator.MULTIPLICATION, ONE);
RelativeDuration division = RelativeDuration.from(ArithmeticOperator.DIVISION, ONE);
RelativeDuration modulus = RelativeDuration.from(ArithmeticOperator.MODULUS, ONE);
RelativeDuration power = RelativeDuration.from(ArithmeticOperator.POWER, ONE);
Assert.assertEquals(RelativeDuration.ZERO, RelativeDuration.fromString(""));
Assert.assertEquals(RelativeDuration.ZERO, RelativeDuration.fromString("~"));
// RelativeDuration assumes ADDITION when no operator is present
Assert.assertEquals(add, RelativeDuration.fromString("~1s"));
Assert.assertEquals(add, RelativeDuration.fromString("~+1s"));
Assert.assertEquals(add, RelativeDuration.fromString("~1")); // no unit defaults to seconds
Assert.assertEquals(subtract, RelativeDuration.fromString("~+-1s"));
Assert.assertEquals(subtract, RelativeDuration.fromString("~+-1"));
Assert.assertEquals(subtract, RelativeDuration.fromString("~-1s"));
Assert.assertEquals(subtract, RelativeDuration.fromString("~-1"));
Assert.assertEquals(multiplication, RelativeDuration.fromString("~*1s"));
Assert.assertEquals(multiplication, RelativeDuration.fromString("~*1"));
Assert.assertEquals(division, RelativeDuration.fromString("~/1s"));
Assert.assertEquals(division, RelativeDuration.fromString("~/1"));
Assert.assertEquals(modulus, RelativeDuration.fromString("~%1s"));
Assert.assertEquals(modulus, RelativeDuration.fromString("~%1"));
Assert.assertEquals(power, RelativeDuration.fromString("~^1s"));
Assert.assertEquals(power, RelativeDuration.fromString("~^1"));
}
}