package org.yamcs.utils;
import junit.framework.Assert;
import org.junit.Ignore;
import org.junit.Test;
import java.util.Date;
/**
* Created by msc on 18/11/15.
*/
public class TimeEncodingTest {
@Test
public void checkMaxInstantValue()
{
TimeEncoding.setUp();
// Assert that TimeEncoding can encode/decode with MAX_INSTANT
String sMax = TimeEncoding.toString(TimeEncoding.MAX_INSTANT);
long decodedMax = TimeEncoding.parse(sMax);
String sRMax = TimeEncoding.toString(decodedMax);
Assert.assertTrue(sMax.equals(sRMax));
// Assert that TimeEncoding fails to encode/decode with MAX_INSTANT + 1
sMax = TimeEncoding.toString(TimeEncoding.MAX_INSTANT + 1);
decodedMax = TimeEncoding.parse(sMax);
sRMax = TimeEncoding.toString(decodedMax);
Assert.assertFalse(sMax.equals(sRMax));
}
@Test
public void findMaxInstantValue()
{
// The algorithm below determines the TimeEncoding.MAX_INSTANT
// that the TimeEncoding object can encode and decode properlly
TimeEncoding.setUp();
boolean foundOverflow = false;
boolean foundMax = false;
long offset = 1;
long base = new Date().getTime();
while(true) {
while (!foundOverflow) {
offset *= 2;
String sMax = TimeEncoding.toString(base + offset);
long decodedMax = TimeEncoding.parse(sMax);
String sRMax = TimeEncoding.toString(decodedMax);
if (!sMax.equals(sRMax)) {
foundOverflow = true;
}
}
//System.out.println("overflow, offset = " + offset);
if(offset <= 2)
{
break;
}
base = base + offset / 2;
offset = 1;
foundOverflow = false;
//System.out.println("current max = " + base);
//System.out.println(TimeEncoding.toString(base));
}
while(!foundMax)
{
base++;
String sMax = TimeEncoding.toString(base);
long decodedMax = TimeEncoding.parse(sMax);
String sRMax = TimeEncoding.toString(decodedMax);
if (!sMax.equals(sRMax)) {
base--;
foundMax = true;
}
}
System.out.println("max = " + base);
System.out.println(TimeEncoding.toString(base));
Assert.assertEquals(base, TimeEncoding.MAX_INSTANT);
}
}