package org.yamcs.utils; import static org.junit.Assert.*; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; import org.junit.BeforeClass; import org.junit.Test; import org.yamcs.utils.GpsCcsdsTime; import org.yamcs.utils.TimeEncoding; public class TimeEncodingTest { static final long j1972=(2L*365*24*3600+10)*1000+123; @BeforeClass public static void setUpBeforeClass() { TimeEncoding.setUp(); } @Test public void testCurrentInstant() { TimeEncoding.getWallclockTime(); long time=System.currentTimeMillis(); long instant=TimeEncoding.getWallclockTime(); long correction=Math.abs(instant-time)%1000; assertTrue(correction<3); time+=correction; String sinstant=TimeEncoding.toString(instant); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); String stime=sdf.format(new Date(time)); assertEquals(sinstant, stime); } @Test public void testToStringLong() { assertEquals("1972-01-01T00:00:00.123", TimeEncoding.toString(j1972)); } @Test public void testToOrdinalDateTimeLong() { assertEquals("1972-001T00:00:00.123", TimeEncoding.toOrdinalDateTime(j1972)); } @Test public void testToCombinedFormatLong() { assertEquals("1972-01-01/001T00:00:00.123", TimeEncoding.toCombinedFormat(j1972)); } @Test public void testFromGpsCcsds() { long instant=TimeEncoding.fromGpsCcsdsTime(0, (byte)128); assertEquals("1980-01-06T00:00:00.500", TimeEncoding.toString(instant)); } @Test public void testFromGpsYearSecMillis() { long instant=TimeEncoding.fromGpsYearSecMillis(2010, 15, 200); assertEquals("2010-01-01T00:00:00.200", TimeEncoding.toString(instant)); } @Test public void getInstantFromUnix2() throws ParseException { long instant=TimeEncoding.fromUnixTime(123); assertEquals("1970-01-01T00:00:00.123", TimeEncoding.toString(instant)); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); long inst1 = TimeEncoding.fromUnixTime(sdf.parse("2008-12-31T23:59:59.125").getTime()); long inst2 = TimeEncoding.fromUnixTime(sdf.parse("2009-01-01T00:00:00.126").getTime()); assertEquals("2008-12-31T23:59:59.125", TimeEncoding.toString(inst1)); assertEquals("2009-01-01T00:00:00.126", TimeEncoding.toString(inst2)); assertEquals(2001, (inst2-inst1)); } @Test public void getUnixFromInstant() throws ParseException { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); long unix1 = sdf.parse("2008-12-31T23:59:59.125").getTime(); long unix2 = sdf.parse("2009-01-01T00:00:00.126").getTime(); long inst1 = TimeEncoding.fromUnixTime(unix1); long inst2 = TimeEncoding.fromUnixTime(unix2); assertEquals("2008-12-31T23:59:59.125", TimeEncoding.toString(inst1)); assertEquals("2009-01-01T00:00:00.126", TimeEncoding.toString(inst2)); assertEquals(1001, (unix2-unix1)); assertEquals(2001, (inst2-inst1)); } @Test public void testGetInstantFromUnix() { long instant=TimeEncoding.fromUnixTime(1266539888, 20000); assertEquals("2010-02-19T00:38:08.020", TimeEncoding.toString(instant)); } @Test public void testGetInstantFromCal() throws ParseException { Calendar cal=Calendar.getInstance(TimeZone.getTimeZone("UTC")); String utc="2010-01-01T00:00:00.000"; SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); Date d=sdf.parse(utc); cal.setTime(d); long instant=TimeEncoding.fromCalendar(cal); String s=TimeEncoding.toString(instant); assertEquals(utc,s); utc="2010-12-31T23:59:59.000"; d=sdf.parse(utc); cal.setTime(d); System.out.println("sdf,format:"+sdf.format(d)+"\nd="+d+"\ncal="+cal.getTime()+"\nhod="+cal.get(Calendar.HOUR_OF_DAY)); instant=TimeEncoding.fromCalendar(cal); s=TimeEncoding.toString(instant); System.out.println("s="+s); assertEquals(utc,s); } @Test public void testGetJavaGpsFromInstant() { String utc="2010-01-01T00:00:00"; String javagps="2010-01-01T00:00:15.000"; SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); long instant=TimeEncoding.parse(utc); long jt=TimeEncoding.getJavaGpsFromInstant(instant); String s=sdf.format(new Date(jt)); assertEquals(javagps, s); } @Test public void testParse() { assertEquals(1230768032001L, TimeEncoding.parse("2008-12-31T23:59:59.001")); assertEquals(1230768033000L, TimeEncoding.parse("2008-12-31T23:59:60")); assertEquals(1230768034000L, TimeEncoding.parse("2009-01-01T00:00:00")); assertEquals(1230768034000L, TimeEncoding.parse("2009/001T00:00:00")); assertEquals(1230768033000L, TimeEncoding.parse("2008/366T23:59:60")); } @Test public void testToString() { assertEquals("2008-12-31T23:59:59.000", TimeEncoding.toString(1230768032000L)); assertEquals("2008-12-31T23:59:60.000", TimeEncoding.toString(1230768033000L)); assertEquals("2009-01-01T00:00:00.000", TimeEncoding.toString(1230768034000L)); } @Test public void testGetGpsTime1() { final int startCoarseTime = 981456898; for (int coarseTime = startCoarseTime; coarseTime < startCoarseTime + 5; ++coarseTime) { for (short fineTime=0; fineTime < 256; ++fineTime) { GpsCcsdsTime time = TimeEncoding.toGpsTime( TimeEncoding.fromGpsCcsdsTime(coarseTime, (byte)fineTime) ); // System.out.println("in coarse: " + coarseTime + "\tin fine: " + (fineTime&0xFF)); //System.out.println("out coarse: " + time.coarseTime + "\tout fine: " + (time.fineTime&0xFF)); assertEquals(time.coarseTime, coarseTime); assertTrue( Math.abs( (time.fineTime&0xFF) - fineTime ) <= 1 ); } } } @Test public void testGetGpsTime2() { long instant=1293841234004L; GpsCcsdsTime time = TimeEncoding.toGpsTime(instant); assertEquals(977876415, time.coarseTime); assertEquals(1, time.fineTime); } }