001    package org.hackystat.telemetry.analyzer.function.impl;
002    
003    import junit.framework.TestCase;
004    
005    import org.hackystat.telemetry.analyzer.model.TelemetryDataPoint;
006    import org.hackystat.telemetry.analyzer.model.TelemetryStream;
007    import org.hackystat.telemetry.analyzer.model.TelemetryStreamCollection;
008    import org.hackystat.sensorbase.resource.projects.jaxb.Project;
009    import org.hackystat.utilities.time.interval.DayInterval;
010    import org.hackystat.utilities.time.period.Day;
011    
012    /**
013     * Test suite for <code>FilterFunction</code>.
014     * 
015     * @author (Cedric) Qin ZHANG
016     */
017    public class TestFilterFunction extends TestCase {
018    
019      private FilterFunction filterFunction = new FilterFunction();
020      private String projectName = "TestFilterFunction";
021      private Project project;
022      private Day startDay;
023      private DayInterval interval;
024      
025      private String test1 = "test1";
026      private String test2 = "test2";
027      private String test3 = "test3";
028      private String avg = "Avg"; 
029      private String topPercent = "TopPercent";
030      private String bottomPercent = "BottomPercent";
031      private String top = "Top";
032      private String bottom = "Bottom";
033      
034      
035      
036      /**
037       * Sets up this test case.
038       * @throws Exception If test case cannot be set up.
039       */
040      @Override
041      protected void setUp() throws Exception {
042    
043        //this.project = ProjectManager.getInstance().createTestProjectClientSide(projectName);
044        this.project = new Project();
045        this.project.setName(projectName);
046        this.startDay = Day.getInstance("01-Jan-2004"); 
047        this.interval = new DayInterval(this.startDay, this.startDay.inc(1));
048      }
049      
050      /**
051       * Tears down this test case.
052       * @throws Exception If tear down failed.
053       */
054      @Override
055      protected void tearDown() throws Exception {
056        //ProjectManager.getInstance().deleteProject(this.projectName);
057      }
058      
059      /**
060       * Tests the filter in absolute mode.
061       * @throws Exception If test fails.
062       */
063      public void testFilterAbsoluteMode() throws Exception {    
064        TelemetryStreamCollection input 
065            = new TelemetryStreamCollection("test", this.project, this.interval);
066        TelemetryStream inputStream1 = new TelemetryStream(test1);
067        inputStream1.addDataPoint(new TelemetryDataPoint(this.startDay, Integer.valueOf(1)));
068        inputStream1.addDataPoint(new TelemetryDataPoint(this.startDay.inc(1), Integer.valueOf(2)));
069        input.add(inputStream1);
070        TelemetryStream inputStream2 = new TelemetryStream(test2);
071        inputStream2.addDataPoint(new TelemetryDataPoint(this.startDay, Integer.valueOf(3)));
072        inputStream2.addDataPoint(new TelemetryDataPoint(this.startDay.inc(1), Integer.valueOf(4)));
073        input.add(inputStream2);
074        TelemetryStream inputStream3 = new TelemetryStream(test3);
075        inputStream3.addDataPoint(new TelemetryDataPoint(this.startDay, Integer.valueOf(0)));
076        inputStream3.addDataPoint(new TelemetryDataPoint(this.startDay.inc(1), Integer.valueOf(5)));
077        input.add(inputStream3);
078        
079        //Mode AllAbove
080        TelemetryStreamCollection output = (TelemetryStreamCollection) 
081            this.filterFunction.compute(new Object[]{input, "Min", "Above", Integer.valueOf(2)});
082        assertEquals(1, output.getTelemetryStreams().size());
083        assertSame(inputStream2, output.get(test2));
084    
085        //Mode AllBlow
086        output = (TelemetryStreamCollection) 
087            this.filterFunction.compute(new Object[]{input, "Max", "Below", Integer.valueOf(3)});
088        assertEquals(1, output.getTelemetryStreams().size());
089        assertSame(inputStream1, output.get(test1));
090    
091        //Mode AnyAbove
092        output = (TelemetryStreamCollection) 
093            this.filterFunction.compute(new Object[]{input, "Max", "Above", Integer.valueOf(3)});
094        assertEquals(2, output.getTelemetryStreams().size());
095        assertSame(inputStream2, output.get(test2));
096        assertSame(inputStream3, output.get(test3));
097        
098        //Mode AnyBelow
099        output = (TelemetryStreamCollection) 
100            this.filterFunction.compute(new Object[]{input, "Min", "Below", Integer.valueOf(3)});
101        assertEquals(2, output.getTelemetryStreams().size());
102        assertSame(inputStream1, output.get(test1));
103        assertSame(inputStream3, output.get(test3));    
104      }
105      
106      /**
107       * Tests the filter in relative mode.
108       * @throws Exception If test fails.
109       */
110      public void testFilterRelativeMode() throws Exception {    
111        TelemetryStreamCollection input 
112            = new TelemetryStreamCollection("test", this.project, this.interval);
113        TelemetryStream inputStream1 = new TelemetryStream(test1);
114        inputStream1.addDataPoint(new TelemetryDataPoint(this.startDay, Integer.valueOf(1)));
115        inputStream1.addDataPoint(new TelemetryDataPoint(this.startDay.inc(1), Integer.valueOf(1)));
116        input.add(inputStream1);
117        TelemetryStream inputStream2 = new TelemetryStream(test2);
118        inputStream2.addDataPoint(new TelemetryDataPoint(this.startDay, Integer.valueOf(2)));
119        inputStream2.addDataPoint(new TelemetryDataPoint(this.startDay.inc(1), Integer.valueOf(2)));
120        input.add(inputStream2);
121        TelemetryStream inputStream3 = new TelemetryStream(test3);
122        inputStream3.addDataPoint(new TelemetryDataPoint(this.startDay, Integer.valueOf(3)));
123        inputStream3.addDataPoint(new TelemetryDataPoint(this.startDay.inc(1), Integer.valueOf(3)));
124        input.add(inputStream3);
125    
126        //Mode TopPercent
127        TelemetryStreamCollection output = (TelemetryStreamCollection) 
128            this.filterFunction.compute(new Object[]{input, avg, topPercent, Integer.valueOf(30)});
129        assertEquals(1, output.getTelemetryStreams().size());
130        assertSame(inputStream3, output.get(test3));
131        output = (TelemetryStreamCollection) 
132            this.filterFunction.compute(new Object[]{input, avg, topPercent, Integer.valueOf(60)});
133        assertEquals(2, output.getTelemetryStreams().size());
134        assertSame(inputStream2, output.get(test2));
135        assertSame(inputStream3, output.get(test3));
136        output = (TelemetryStreamCollection) 
137            this.filterFunction.compute(new Object[]{input, avg, topPercent, Integer.valueOf(0)});
138        assertEquals(0, output.getTelemetryStreams().size());
139        output = (TelemetryStreamCollection) 
140            this.filterFunction.compute(new Object[]{input, avg, topPercent, Integer.valueOf(100)});
141        assertEquals(3, output.getTelemetryStreams().size());
142        
143        //Mode BottomPercent
144        output = (TelemetryStreamCollection) 
145            this.filterFunction.compute(new Object[]{input, avg, bottomPercent, Integer.valueOf(30)});
146        assertEquals(1, output.getTelemetryStreams().size());
147        assertSame(inputStream1, output.get(test1));
148        output = (TelemetryStreamCollection) 
149            this.filterFunction.compute(new Object[]{input, avg, bottomPercent, Integer.valueOf(60)});
150        assertEquals(2, output.getTelemetryStreams().size());
151        assertSame(inputStream1, output.get(test1));
152        assertSame(inputStream2, output.get(test2));
153        output = (TelemetryStreamCollection) 
154            this.filterFunction.compute(new Object[]{input, avg, bottomPercent, Integer.valueOf(0)});
155        assertEquals(0, output.getTelemetryStreams().size());
156        output = (TelemetryStreamCollection) 
157            this.filterFunction.compute(new Object[]{input, avg, bottomPercent, Integer.valueOf(100)});
158        assertEquals(3, output.getTelemetryStreams().size());
159        
160        //Mode Top
161        output = (TelemetryStreamCollection) 
162            this.filterFunction.compute(new Object[]{input, avg, top, Integer.valueOf(2)});
163        assertEquals(2, output.getTelemetryStreams().size());
164        assertSame(inputStream2, output.get(test2));
165        assertSame(inputStream3, output.get(test3));
166        output = (TelemetryStreamCollection) 
167            this.filterFunction.compute(new Object[]{input, avg, top, Integer.valueOf(-1)});
168        assertEquals(0, output.getTelemetryStreams().size());
169        output = (TelemetryStreamCollection) 
170            this.filterFunction.compute(new Object[]{input, avg, top, Integer.valueOf(0)});
171        assertEquals(0, output.getTelemetryStreams().size());
172        output = (TelemetryStreamCollection) 
173            this.filterFunction.compute(new Object[]{input, avg, top, Integer.valueOf(1)});
174        assertEquals(1, output.getTelemetryStreams().size());
175        output = (TelemetryStreamCollection) 
176            this.filterFunction.compute(new Object[]{input, avg, top, Integer.valueOf(2)});
177        assertEquals(2, output.getTelemetryStreams().size());
178        output = (TelemetryStreamCollection) 
179            this.filterFunction.compute(new Object[]{input, avg, top, Integer.valueOf(3)});
180        assertEquals(3, output.getTelemetryStreams().size());
181        output = (TelemetryStreamCollection) 
182            this.filterFunction.compute(new Object[]{input, avg, top, Integer.valueOf(4)});
183        assertEquals(3, output.getTelemetryStreams().size());
184    
185        //Mode Bottom
186        output = (TelemetryStreamCollection) 
187            this.filterFunction.compute(new Object[]{input, avg, bottom, Integer.valueOf(2)});
188        assertEquals(2, output.getTelemetryStreams().size());
189        assertSame(inputStream1, output.get(test1));
190        assertSame(inputStream2, output.get(test2));  
191        output = (TelemetryStreamCollection) 
192            this.filterFunction.compute(new Object[]{input, avg, bottom, Integer.valueOf(-1)});
193        assertEquals(0, output.getTelemetryStreams().size());
194        output = (TelemetryStreamCollection) 
195            this.filterFunction.compute(new Object[]{input, avg, bottom, Integer.valueOf(0)});
196        assertEquals(0, output.getTelemetryStreams().size());
197        output = (TelemetryStreamCollection) 
198            this.filterFunction.compute(new Object[]{input, avg, bottom, Integer.valueOf(1)});
199        assertEquals(1, output.getTelemetryStreams().size());
200        output = (TelemetryStreamCollection) 
201            this.filterFunction.compute(new Object[]{input, avg, bottom, Integer.valueOf(2)});
202        assertEquals(2, output.getTelemetryStreams().size());
203        output = (TelemetryStreamCollection) 
204            this.filterFunction.compute(new Object[]{input, avg, bottom, "3"});
205        assertEquals(3, output.getTelemetryStreams().size());
206        output = (TelemetryStreamCollection) 
207            this.filterFunction.compute(new Object[]{input, avg, bottom, "4"});
208        assertEquals(3, output.getTelemetryStreams().size());
209      }
210      
211      /**
212       * Tests the rank functions.
213       * @throws Exception If test fails.
214       */
215      public void testRankFunctions() throws Exception {    
216        TelemetryStreamCollection input 
217            = new TelemetryStreamCollection("test", this.project, this.interval);
218        TelemetryStream inputStream1 = new TelemetryStream(test1);
219        inputStream1.addDataPoint(new TelemetryDataPoint(this.startDay, Integer.valueOf(100)));
220        inputStream1.addDataPoint(new TelemetryDataPoint(this.startDay.inc(1), Integer.valueOf(50)));
221        input.add(inputStream1);
222        TelemetryStream inputStream2 = new TelemetryStream(test2);
223        inputStream2.addDataPoint(new TelemetryDataPoint(this.startDay, Integer.valueOf(3)));
224        inputStream2.addDataPoint(new TelemetryDataPoint(this.startDay.inc(1), Integer.valueOf(4)));
225        input.add(inputStream2);
226        TelemetryStream inputStream3 = new TelemetryStream(test3);
227        inputStream3.addDataPoint(new TelemetryDataPoint(this.startDay, Integer.valueOf(120)));
228        inputStream3.addDataPoint(new TelemetryDataPoint(this.startDay.inc(1), Integer.valueOf(-100)));
229        input.add(inputStream3);
230        
231        FilterFunction.RankFunction rank = null;
232        
233        //Average: (150/2, 7/2, 20/2)
234        rank = new FilterFunction.AverageRankFunction();
235        assertEquals(150.0 / 2, rank.getRank(inputStream1), 0);
236        assertEquals(7.0 / 2, rank.getRank(inputStream2), 0);
237        assertEquals(20.0 / 2, rank.getRank(inputStream3), 0);
238        TelemetryStreamCollection output = (TelemetryStreamCollection) 
239            this.filterFunction.compute(new Object[]{input, avg, top, Integer.valueOf(1)});
240        assertEquals(1, output.getTelemetryStreams().size());
241        assertSame(inputStream1, output.get(test1));
242    
243        //Max: (100, 4, 120)
244        rank = new FilterFunction.MaxRankFunction();
245        assertEquals(100.0, rank.getRank(inputStream1), 0);
246        assertEquals(4.0, rank.getRank(inputStream2), 0);
247        assertEquals(120.0, rank.getRank(inputStream3), 0);
248        output = (TelemetryStreamCollection) 
249            this.filterFunction.compute(new Object[]{input, "Max", top, Integer.valueOf(1)});
250        assertEquals(1, output.getTelemetryStreams().size());
251        assertSame(inputStream3, output.get(test3));
252    
253        //Min (50, 3, -100)
254        rank = new FilterFunction.MinRankFunction();
255        assertEquals(50.0, rank.getRank(inputStream1), 0);
256        assertEquals(3.0, rank.getRank(inputStream2), 0);
257        assertEquals(-100.0, rank.getRank(inputStream3), 0);
258        output = (TelemetryStreamCollection) 
259            this.filterFunction.compute(new Object[]{input, "Min", top, Integer.valueOf(1)});
260        assertEquals(1, output.getTelemetryStreams().size());
261        assertSame(inputStream1, output.get(test1));
262    
263        //Min (50, 4, -100)
264        rank = new FilterFunction.LastRankFunction();
265        assertEquals(50.0, rank.getRank(inputStream1), 0);
266        assertEquals(4.0, rank.getRank(inputStream2), 0);
267        assertEquals(-100.0, rank.getRank(inputStream3), 0);
268        output = (TelemetryStreamCollection) 
269            this.filterFunction.compute(new Object[]{input, "Last", top, Integer.valueOf(1)});
270        assertEquals(1, output.getTelemetryStreams().size());
271        assertSame(inputStream1, output.get(test1));
272        
273        //Delta (50, 1, 220)
274        rank = new FilterFunction.DeltaRankFunction();
275        assertEquals(50.0, rank.getRank(inputStream1), 0);
276        assertEquals(1.0, rank.getRank(inputStream2), 0);
277        assertEquals(220.0, rank.getRank(inputStream3), 0);
278        output = (TelemetryStreamCollection) 
279            this.filterFunction.compute(new Object[]{input, "Delta", top, Integer.valueOf(1)});
280        assertEquals(1, output.getTelemetryStreams().size());
281        assertSame(inputStream3, output.get(test3));
282        
283        //SimpleDelta (-50, 1, -220)
284        rank = new FilterFunction.SimpleDeltaRankFunction();
285        assertEquals(-50.0, rank.getRank(inputStream1), 0);
286        assertEquals(1.0, rank.getRank(inputStream2), 0);
287        assertEquals(-220.0, rank.getRank(inputStream3), 0);
288        output = (TelemetryStreamCollection) 
289            this.filterFunction.compute(new Object[]{input, "SimpleDelta", top, Integer.valueOf(1)});
290        assertEquals(1, output.getTelemetryStreams().size());
291        assertSame(inputStream2, output.get(test2));
292      }
293    }