Skip to content

Commit 9091dfc

Browse files
Add tests
1 parent 995fc6a commit 9091dfc

File tree

2 files changed

+206
-1
lines changed

2 files changed

+206
-1
lines changed

lha/HistoricalTable.lua

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,11 +580,15 @@ return class.create(function(historicalTable)
580580
return tt
581581
end
582582

583+
function historicalTable:clearAggregation()
584+
removeTableKeys(self.liveTable, hasSuffix)
585+
end
586+
583587
function historicalTable:rollover()
584588
local currentTable, previousTable
585589
previousTable = self.previousTable
586590
currentTable = tables.deepCopy(self.liveTable)
587-
removeTableKeys(self.liveTable, hasSuffix)
591+
self:clearAggregation()
588592
self.previousTable = currentTable
589593
return currentTable, previousTable
590594
end

tools/tests.lua

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
local lu = require('luaunit')
2+
3+
local File = require('jls.io.File')
4+
local Date = require('jls.util.Date')
5+
local tables = require('jls.util.tables')
6+
7+
local HistoricalTable = require('lha.HistoricalTable')
8+
9+
local TEST_PATH = 'tools'
10+
local TMP_PATH = TEST_PATH..'/tmp'
11+
12+
local PERIOD = 15
13+
local REF_TIME = Date.fromISOString('2022-04-01T10:00:00') // 1000
14+
15+
local function getTmpDir()
16+
local tmpDir = File:new(TMP_PATH)
17+
if tmpDir:isDirectory() then
18+
if not tmpDir:deleteRecursive() then
19+
error('Cannot delete tmp dir')
20+
end
21+
end
22+
return tmpDir
23+
end
24+
25+
local function getEmptyTmpDir()
26+
local tmpDir = File:new(TMP_PATH)
27+
if tmpDir:isDirectory() then
28+
if not tmpDir:deleteAll() then
29+
error('Cannot delete tmp dir')
30+
end
31+
else
32+
if not tmpDir:mkdir() then
33+
error('Cannot create tmp dir')
34+
end
35+
end
36+
return tmpDir
37+
end
38+
39+
local function applySamples(ht, samples, debug)
40+
local t = ht:getLiveTable()
41+
for _, sample in ipairs(samples) do
42+
if type(sample) == 'table' then
43+
for k, v in pairs(sample) do
44+
ht:aggregateValue(k, v)
45+
end
46+
elseif type(sample) == 'number' then
47+
if debug then
48+
print(tables.stringify(t, 2))
49+
end
50+
ht:save(false, sample * 1000)
51+
end
52+
end
53+
end
54+
55+
local function getValues(values, key)
56+
local l = {}
57+
for i, t in ipairs(values) do
58+
l[i] = t[key]
59+
end
60+
return l
61+
end
62+
63+
local function loadValues(ht, startTime, endTime, period, path, debug)
64+
local values = ht:loadValues((startTime - 1) * 1000, (endTime + 1) * 1000, period * 1000, path)
65+
--print(tables.stringify(values, 2))
66+
if debug then
67+
print('values', startTime, endTime, period, table.concat(getValues(values, 'time'), ','))
68+
end
69+
--table.remove(values, 1)
70+
return values
71+
end
72+
73+
function Test_aggregate_min_max()
74+
local period = PERIOD
75+
local time = REF_TIME
76+
local startTime = time
77+
local function nextTime()
78+
local t = time
79+
time = time + period
80+
return t
81+
end
82+
local samples = {
83+
{temperature = 19},
84+
nextTime(),
85+
{temperature = 19},
86+
nextTime(),
87+
{temperature = 19},
88+
{temperature = 19},
89+
nextTime(),
90+
{temperature = 19},
91+
{temperature = 20},
92+
nextTime(),
93+
{temperature = 20},
94+
{temperature = 18},
95+
nextTime(),
96+
{temperature = 18},
97+
{temperature = 21},
98+
{temperature = 18},
99+
nextTime(),
100+
{temperature = 18},
101+
nextTime(),
102+
}
103+
local endTime = time
104+
105+
local values, value
106+
local tmpDir = getEmptyTmpDir()
107+
local ht = HistoricalTable:new(tmpDir, 'test')
108+
applySamples(ht, samples)
109+
values = loadValues(ht, startTime, endTime, period, 'temperature')
110+
lu.assertEquals(getValues(values, 'count'), {1, 1, 1, 1, 1, 1, 1})
111+
lu.assertEquals(getValues(values, 'min'), {19, 19, 19, 19, 18, 18, 18})
112+
lu.assertEquals(getValues(values, 'max'), {19, 19, 19, 20, 20, 21, 18})
113+
lu.assertEquals(getValues(values, 'average'), {19, 19, 19, 20, 18, 18, 18}) -- average is computed with the last period value
114+
values = loadValues(ht, startTime, endTime, endTime - startTime, 'temperature')
115+
lu.assertEquals(getValues(values, 'count'), {7})
116+
value = values[1]
117+
lu.assertAlmostEquals(value.average, 18.7, 0.1)
118+
lu.assertEquals(value.min, 18)
119+
lu.assertEquals(value.max, 21)
120+
end
121+
122+
function Test_aggregate_changes()
123+
local period = PERIOD
124+
local time = REF_TIME
125+
local startTime = time
126+
local function nextTime()
127+
local t = time
128+
time = time + period
129+
return t
130+
end
131+
local samples = {
132+
{presence = false},
133+
nextTime(),
134+
{presence = false},
135+
nextTime(),
136+
{presence = false},
137+
{presence = false},
138+
nextTime(),
139+
{presence = false},
140+
{presence = true},
141+
nextTime(),
142+
{presence = true},
143+
{presence = false},
144+
nextTime(),
145+
{presence = false},
146+
{presence = true},
147+
{presence = false},
148+
nextTime(),
149+
{presence = false},
150+
nextTime(),
151+
}
152+
local endTime = time
153+
154+
local values
155+
local tmpDir = getEmptyTmpDir()
156+
local ht = HistoricalTable:new(tmpDir, 'test')
157+
applySamples(ht, samples)
158+
values = loadValues(ht, startTime, endTime, period, 'presence')
159+
lu.assertEquals(getValues(values, 'changes'), {1, 0, 0, 1, 1, 2, 0})
160+
lu.assertEquals(getValues(values, 'count'), {1, 1, 1, 1, 1, 1, 1})
161+
values = loadValues(ht, startTime, endTime, endTime - startTime, 'presence')
162+
lu.assertEquals(getValues(values, 'changes'), {5})
163+
lu.assertEquals(getValues(values, 'count'), {7})
164+
end
165+
166+
function Test_aggregate_clear()
167+
local samples = {
168+
{temperature = 19},
169+
{presence = false},
170+
{presence = true},
171+
{presence = false, temperature = 18},
172+
{temperature = 21},
173+
{temperature = 18},
174+
}
175+
local tmpDir = getEmptyTmpDir()
176+
local ht = HistoricalTable:new(tmpDir, 'test')
177+
applySamples(ht, samples)
178+
--print(tables.stringify(ht.liveTable, 2))
179+
lu.assertEquals(ht.liveTable, {
180+
presence = false,
181+
["presence&changes"] = 3,
182+
temperature = 18,
183+
["temperature&max"] = 21,
184+
["temperature&min"] = 18,
185+
})
186+
ht:clearAggregation()
187+
--print(tables.stringify(ht.liveTable, 2))
188+
lu.assertEquals(ht.liveTable, {
189+
presence = false,
190+
temperature = 18,
191+
})
192+
193+
end
194+
195+
-- last test will cleanup the tmp dir
196+
function Test_z_cleanup()
197+
local f = getTmpDir()
198+
lu.assertEquals(f:isDirectory(), false)
199+
end
200+
201+
os.exit(lu.LuaUnit.run())

0 commit comments

Comments
 (0)