Fix wrong month numeration
[idea/community.git] / plugins / stats-collector / test / com / intellij / stats / personalization / AggregatedFactorTest.kt
1 package com.intellij.stats.personalization
2
3 import com.intellij.stats.personalization.impl.*
4 import com.intellij.testFramework.UsefulTestCase
5 import junit.framework.TestCase
6 import org.junit.Assert
7 import java.util.*
8
9 /**
10  * @author Vitaliy.Bibaev
11  */
12 class AggregatedFactorTest : UsefulTestCase() {
13     private companion object {
14         val DATE_1 = DateUtil.byDate(Calendar.Builder().setDate(2010, 0, 1).build().time)
15         val DATE_2 = DATE_1.update(1)
16         val DATE_3 = DATE_1.update(2)
17         val DATE_4 = DATE_1.update(3)
18
19         fun Day.update(count: Int): Day {
20             return Calendar.getInstance().let {
21                 it.set(year, month - 1, dayOfMonth)
22                 it.add(Calendar.DATE, count)
23                 DateUtil.byDate(it.time)
24             }
25         }
26     }
27
28     fun `test min is correct`() {
29         val aggregateFactor: MutableDoubleFactor = UserFactorStorageBase.DailyAggregateFactor()
30
31         aggregateFactor.setOnDate(DATE_1, "count", 10.0)
32         aggregateFactor.setOnDate(DATE_3, "count", 20.0)
33         aggregateFactor.setOnDate(DATE_4, "delay", 1000.0)
34
35         val mins = createFactorForTests().aggregateMin()
36         TestCase.assertEquals(2, mins.size)
37         UsefulTestCase.assertEquals(10.0, mins["count"])
38         UsefulTestCase.assertEquals(1000.0, mins["delay"])
39     }
40
41     fun `test max is correct`() {
42         val maximums = createFactorForTests().aggregateMax()
43         TestCase.assertEquals(2, maximums.size)
44         UsefulTestCase.assertEquals(20.0, maximums["count"])
45         UsefulTestCase.assertEquals(1000.0, maximums["delay"])
46     }
47
48     fun `test sum is correct`() {
49         val maximums = createFactorForTests().aggregateSum()
50         TestCase.assertEquals(2, maximums.size)
51         UsefulTestCase.assertEquals(30.0, maximums["count"])
52         UsefulTestCase.assertEquals(1000.0, maximums["delay"])
53     }
54
55     fun `test average is only on present`() {
56         val maximums = createFactorForTests().aggregateAverage()
57         TestCase.assertEquals(2, maximums.size)
58         UsefulTestCase.assertEquals(15.0, maximums["count"]!!, 1e-10)
59         UsefulTestCase.assertEquals(1000.0, maximums["delay"]!!, 1e-10)
60     }
61
62     fun `test average does not lose precision`() {
63         val factor: MutableDoubleFactor = UserFactorStorageBase.DailyAggregateFactor()
64         factor.setOnDate(DATE_1, "key1", Double.MAX_VALUE)
65         factor.setOnDate(DATE_2, "key1", Double.MAX_VALUE)
66
67         val avg = factor.aggregateAverage()
68         TestCase.assertEquals(1, avg.size)
69         Assert.assertNotEquals(Double.POSITIVE_INFINITY, avg["key1"]!!)
70     }
71
72     fun `test factor stores information only for the last 10 days`() {
73         val fieldName = "count"
74         val factor: MutableDoubleFactor = UserFactorStorageBase.DailyAggregateFactor()
75         for (i in 0 until 10) {
76             TestCase.assertTrue(factor.updateOnDate(DATE_1.update(i)) {
77                 put(fieldName, i.toDouble())
78             })
79         }
80
81         TestCase.assertEquals(45.0, factor.aggregateSum()[fieldName]!!, 1e-10)
82         TestCase.assertNotNull(factor.onDate(DATE_1))
83         TestCase.assertFalse(factor.updateOnDate(DATE_1.update(-100)) { put(fieldName, 100.0) })
84         TestCase.assertEquals(9.0, factor.aggregateMax()[fieldName]!!, 1e-10)
85
86         TestCase.assertTrue(factor.updateOnDate(DATE_1.update(100)) { put(fieldName, 1.0) })
87         TestCase.assertEquals(46.0, factor.aggregateSum()[fieldName]!!, 1e-10)
88     }
89
90     private fun createFactorForTests(): DailyAggregatedDoubleFactor {
91         val aggregateFactor: MutableDoubleFactor = UserFactorStorageBase.DailyAggregateFactor()
92
93         aggregateFactor.setOnDate(DATE_1, "count", 10.0)
94         aggregateFactor.setOnDate(DATE_3, "count", 20.0)
95         aggregateFactor.setOnDate(DATE_4, "delay", 1000.0)
96
97         return aggregateFactor
98     }
99 }