package org.commons.jconfig.datatype;
import java.util.concurrent.TimeUnit;
import org.commons.jconfig.datatype.TimeValue;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* Unit tests of the {@linkplain TimeValue}.
* @author sgrennan
*
*/
public class TimeValueTest {
@Test
public void comparisons() {
Assert.assertTrue((new TimeValue(1, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(1, TimeUnit.NANOSECONDS)) == 0);
Assert.assertTrue((new TimeValue(1, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(1, TimeUnit.MICROSECONDS)) < 0);
Assert.assertTrue((new TimeValue(1, TimeUnit.MICROSECONDS)).compareTo(new TimeValue(1, TimeUnit.NANOSECONDS)) > 0);
Assert.assertTrue((new TimeValue(1000, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(1, TimeUnit.MICROSECONDS)) == 0);
Assert.assertTrue((new TimeValue(999, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(1, TimeUnit.MICROSECONDS)) < 0);
Assert.assertTrue((new TimeValue(1, TimeUnit.MICROSECONDS)).compareTo(new TimeValue(999, TimeUnit.NANOSECONDS)) > 0);
Assert.assertTrue((new TimeValue(1001, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(1, TimeUnit.MICROSECONDS)) > 0);
Assert.assertTrue((new TimeValue(1999, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(1, TimeUnit.MICROSECONDS)) > 0);
Assert.assertTrue((new TimeValue(107000, TimeUnit.DAYS)).compareTo(new TimeValue(1, TimeUnit.NANOSECONDS)) > 0);
Assert.assertTrue((new TimeValue(106000, TimeUnit.DAYS)).compareTo(new TimeValue(Long.MAX_VALUE, TimeUnit.NANOSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-1, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(1, TimeUnit.NANOSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-1, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(1, TimeUnit.MICROSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-1, TimeUnit.MICROSECONDS)).compareTo(new TimeValue(1, TimeUnit.NANOSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-1000, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(1, TimeUnit.MICROSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-999, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(1, TimeUnit.MICROSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-1, TimeUnit.MICROSECONDS)).compareTo(new TimeValue(999, TimeUnit.NANOSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-1001, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(1, TimeUnit.MICROSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-1999, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(1, TimeUnit.MICROSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-107000, TimeUnit.DAYS)).compareTo(new TimeValue(1, TimeUnit.NANOSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-106000, TimeUnit.DAYS)).compareTo(new TimeValue(Long.MAX_VALUE, TimeUnit.NANOSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-1, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(-1, TimeUnit.NANOSECONDS)) == 0);
Assert.assertTrue((new TimeValue(-1, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(-1, TimeUnit.MICROSECONDS)) > 0);
Assert.assertTrue((new TimeValue(-1, TimeUnit.MICROSECONDS)).compareTo(new TimeValue(-1, TimeUnit.NANOSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-1000, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(-1, TimeUnit.MICROSECONDS)) == 0);
Assert.assertTrue((new TimeValue(-999, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(-1, TimeUnit.MICROSECONDS)) > 0);
Assert.assertTrue((new TimeValue(-1, TimeUnit.MICROSECONDS)).compareTo(new TimeValue(-999, TimeUnit.NANOSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-1001, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(-1, TimeUnit.MICROSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-1999, TimeUnit.NANOSECONDS)).compareTo(new TimeValue(-1, TimeUnit.MICROSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-107000, TimeUnit.DAYS)).compareTo(new TimeValue(-1, TimeUnit.NANOSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-107000, TimeUnit.DAYS)).compareTo(new TimeValue(1, TimeUnit.NANOSECONDS)) < 0);
Assert.assertTrue((new TimeValue(-106000, TimeUnit.DAYS)).compareTo(new TimeValue(Long.MIN_VALUE, TimeUnit.NANOSECONDS)) > 0);
// Verify that overflow and underflow are caught.
Assert.assertTrue((new TimeValue(107000, TimeUnit.DAYS)).compareTo(new TimeValue(Long.MAX_VALUE, TimeUnit.NANOSECONDS)) > 0);
Assert.assertTrue((new TimeValue(-107000, TimeUnit.DAYS)).compareTo(new TimeValue(Long.MIN_VALUE, TimeUnit.NANOSECONDS)) < 0);
}
/**
* Verifies that we can parse zero and units.
*/
@Test
public void testZeroValues() {
String[] vals = { "0ns", "0us", "0ms", "0s", "0m", "0h", "0d" };
TimeUnit[] tus = { TimeUnit.NANOSECONDS, TimeUnit.MICROSECONDS, TimeUnit.MILLISECONDS,
TimeUnit.SECONDS, TimeUnit.MINUTES, TimeUnit.HOURS, TimeUnit.DAYS
};
for (int index = 0; index < vals.length; index++) {
TimeValue tv = TimeValue.parse(vals[index]);
Assert.assertEquals(tv.getValue(), 0L);
Assert.assertEquals(tv.getTimeUnit(), tus[index]);
}
}
/**
* Verifies that we can parse nonzero and units.
*/
@Test
public void testNonZeros() {
String[] vals = { "150ns", "150us", "150ms", "150s", "150m", "150h", "150d" };
TimeUnit[] tus = { TimeUnit.NANOSECONDS, TimeUnit.MICROSECONDS, TimeUnit.MILLISECONDS,
TimeUnit.SECONDS, TimeUnit.MINUTES, TimeUnit.HOURS, TimeUnit.DAYS
};
for (int index = 0; index < vals.length; index++) {
TimeValue tv = TimeValue.parse(vals[index]);
Assert.assertEquals(tv.getValue(), 150L);
Assert.assertEquals(tv.getTimeUnit(), tus[index]);
}
}
/**
* Verifies that we can convert units to other units.
*/
@Test
public void testConvertValues() {
String[] vals = { "150ns", "150us", "150ms", "150s", "150m", "150h", "150d" };
long[][] longs = {
{ 0, 0, 0, 0, 0, 0 }, // 150ns
{ 150, 0, 0, 0, 0, 0 }, // 150us
{ 150000, 150, 0, 0, 0, 0 }, // 150ms
{ 150000000, 150000, 150, 2, 0, 0 }, // 150s
{ 9000000000L, 9000000, 9000, 150, 2, 0 }, // 150m
{ 540000000000L, 540000000, 540000, 9000, 150, 6 }, // 150h
{ 12960000000000L, 12960000000L, 12960000, 216000, 3600, 150 }, // 150d
};
for (int index = 0; index < vals.length; index++) {
TimeValue tv = TimeValue.parse(vals[index]);
Assert.assertEquals(tv.toMicros(), longs[index][0]);
Assert.assertEquals(tv.toMillis(), longs[index][1]);
Assert.assertEquals(tv.toSeconds(), longs[index][2]);
Assert.assertEquals(tv.toMinutes(), longs[index][3]);
Assert.assertEquals(tv.toHours(), longs[index][4]);
Assert.assertEquals(tv.toDays(), longs[index][5]);
}
}
}