001    package org.hackystat.telemetry.analyzer.model;
002    
003    import java.util.List;
004    
005    import junit.framework.TestCase;
006    
007    import org.hackystat.utilities.time.period.Day;
008    
009    /**
010     * Test suite for <code>TelemetryStream</code>.
011     * 
012     * @author (Cedric) Qin Zhang
013     */
014    public class TestTelemetryStream extends TestCase {
015    
016      /**
017       * Test case.
018       * 
019       * @throws Exception If test fails.
020       */
021      public void testAll() throws Exception {
022        TelemetryStream telemetryStream = new TelemetryStream("TestingStream");
023        assertEquals("TestingStream", telemetryStream.getTag());
024    
025        Day day = Day.getInstance(2003, 1, 1);
026        telemetryStream.addDataPoint(new TelemetryDataPoint(day.inc(1), Integer.valueOf(1)));
027        telemetryStream.addDataPoint(new TelemetryDataPoint(day, Integer.valueOf(0)));
028        telemetryStream.addDataPoint(new TelemetryDataPoint(day.inc(2), Integer.valueOf(2)));
029    
030        assertEquals(Integer.valueOf(0), telemetryStream.getDataPointValue(day));
031        assertEquals(Integer.valueOf(1), telemetryStream.getDataPointValue(day.inc(1)));
032        assertEquals(Integer.valueOf(2), telemetryStream.getDataPointValue(day.inc(2)));
033    
034        List<TelemetryDataPoint> list = telemetryStream.getDataPoints();
035        assertEquals(day, list.get(0).getPeriod());
036        assertEquals(Integer.valueOf(0), list.get(0).getValue());
037        assertEquals(day.inc(1), list.get(1).getPeriod());
038        assertEquals(Integer.valueOf(1), list.get(1).getValue());
039        assertEquals(day.inc(2), list.get(2).getPeriod());
040        assertEquals(Integer.valueOf(2), list.get(2).getValue());
041      }
042      
043      /**
044       * Asserts equality for two telemetry stream objects.
045       * 
046       * @param stream1 Telemetry stream1.
047       * @param stream2 Telemetry stream2.
048       * 
049       * @throws Exception If the two streams are not the same.
050       */
051      static void assertEquals(TelemetryStream stream1, TelemetryStream stream2) throws Exception {
052        assertEquals(stream1.getTag(), stream2.getTag());
053        List<TelemetryDataPoint> dataPoints1 = stream1.getDataPoints();
054        List<TelemetryDataPoint> dataPoints2 = stream2.getDataPoints();
055        assertEquals(dataPoints1.size(), dataPoints2.size());
056        
057        for (int i = 0; i < dataPoints1.size(); i++) {
058          TelemetryDataPoint dp1 = dataPoints1.get(i);
059          TelemetryDataPoint dp2 = dataPoints2.get(i);
060          assertEquals(dp1.getPeriod(), dp2.getPeriod());
061          
062          //don't use dp1.equals(dp2), we allow some error margin due to compute rounding.
063          Number value1 = dp1.getValue();
064          Number value2 = dp2.getValue();
065          if (value1 == null && value2 == null) { //NOPMD
066            //ok, do nothing
067          }
068          else if (value1 != null && value2 != null) { //NOPMD
069            assertEquals(value1.doubleValue(), value2.doubleValue(), 0.0001);
070          }
071          else {
072            throw new Exception("One data point has value null, while the other has non-null value.");
073          }
074        }
075      }
076    }