1 package com.intellij.stats.personalization
3 import com.intellij.stats.personalization.impl.*
4 import com.intellij.testFramework.UsefulTestCase
5 import junit.framework.TestCase
6 import org.junit.Assert
10 * @author Vitaliy.Bibaev
12 class AggregatedFactorTest : UsefulTestCase() {
13 private companion object {
14 val DATE_1 = DateUtil.byDate(Calendar.Builder().setDate(2010, 1, 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)
19 fun Day.update(count: Int): Day {
20 return Calendar.getInstance().let {
21 it.set(year, month, dayOfMonth)
22 it.add(Calendar.DATE, count)
23 DateUtil.byDate(it.time)
28 fun `test min is correct`() {
29 val aggregateFactor: MutableDoubleFactor = UserFactorStorageBase.DailyAggregateFactor()
31 aggregateFactor.setOnDate(DATE_1, "count", 10.0)
32 aggregateFactor.setOnDate(DATE_3, "count", 20.0)
33 aggregateFactor.setOnDate(DATE_4, "delay", 1000.0)
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"])
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"])
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"])
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)
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)
67 val avg = factor.aggregateAverage()
68 TestCase.assertEquals(1, avg.size)
69 Assert.assertNotEquals(Double.POSITIVE_INFINITY, avg["key1"]!!)
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())
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)
86 TestCase.assertTrue(factor.updateOnDate(DATE_1.update(100)) { put(fieldName, 1.0) })
87 TestCase.assertEquals(46.0, factor.aggregateSum()[fieldName]!!, 1e-10)
90 private fun createFactorForTests(): DailyAggregatedDoubleFactor {
91 val aggregateFactor: MutableDoubleFactor = UserFactorStorageBase.DailyAggregateFactor()
93 aggregateFactor.setOnDate(DATE_1, "count", 10.0)
94 aggregateFactor.setOnDate(DATE_3, "count", 20.0)
95 aggregateFactor.setOnDate(DATE_4, "delay", 1000.0)
97 return aggregateFactor