Implement listening

Signed-off-by: Rahix <rahix@rahix.de>
This commit is contained in:
rahix 2019-04-17 02:26:57 +02:00
parent 8fb07e22cc
commit 719201e950
3 changed files with 215 additions and 6 deletions

136
tests/listening.lua Normal file
View file

@ -0,0 +1,136 @@
require("lunit")
local network = require("network")
local serialization = require("serialization")
local BaseControl = require("bc")
module("listening", package.seeall, lunit.testcase)
function test_invalid_query()
local bc = BaseControl:new()
local invalids = {
bc.Query.Equals,
bc.Query.Above,
bc.Query.Below,
}
for _, q in ipairs(invalids) do
assert_error_match("invalid", function()
bc:listen("invq1", q, function() end)
end)
end
end
function test_listen_simple()
local bc = BaseControl:new()
bc:register("lisimpl1", 1234)
bc:finalize()
local n = 0
bc:listen("lisimpl1", bc.Query.Change, function(new)
n = n + 1
end)
assert_equal(0, n, "wrong number of listener invokations")
bc:set("lisimpl1", 4321)
assert_equal(1, n, "wrong number of listener invokations")
bc:set("lisimpl1", 42)
assert_equal(2, n, "wrong number of listener invokations")
end
function test_listen_network_simple()
local bc1 = BaseControl:new()
local addr1 = network.get_scene()
bc1:register("lin1", 1234)
bc1:finalize()
local bc2 = BaseControl:new()
local addr2 = network.get_scene()
local tmp, n = 0, 0
bc2:listen("lin1", bc1.Query.Change, function(new)
assert_equal(tmp, new, "value did not propagate")
n = n + 1
end)
network.set_scene(addr1)
tmp = 12
assert_equal(0, n, "wrong number of listener invokations")
bc1:set("lin1", 12)
assert_equal(1, n, "wrong number of listener invokations")
tmp = 16
bc1:set("lin1", 16)
assert_equal(2, n, "wrong number of listener invokations")
end
-- Generate testcases for queries
do
local tests = {
{name="change", query=BaseControl.Query.Change, pos1=1, neg=1, pos2=2},
{name="rising", query=BaseControl.Query.Rising, pos1=1, neg=-1, pos2=1},
{name="falling", query=BaseControl.Query.Falling, pos1=-1, neg=1, pos2=-1},
{name="equals", query=BaseControl.Query.Equals(123), pos1=123, neg=124, pos2=123},
{name="above", query=BaseControl.Query.Above(100), pos1=101, neg=99, pos2=123},
{name="below", query=BaseControl.Query.Below(100), pos1=12, neg=124, pos2=23},
}
for _, test in ipairs(tests) do
-- Local test
listening["test_listen_query_"..test.name] = function()
local bc = BaseControl:new()
local noun = "lq"..test.name.."1"
bc:register(noun, 0)
bc:finalize()
local n = 0
bc:listen(noun, test.query, function(new)
n = n + 1
end)
assert_equal(0, n, "wrong number of listener invokations")
bc:set(noun, test.pos1)
assert_equal(1, n, "wrong number of listener invokations")
bc:set(noun, test.neg)
assert_equal(1, n, "wrong number of listener invokations")
bc:set(noun, test.pos2)
assert_equal(2, n, "wrong number of listener invokations")
bc:close()
end
-- Remote test
listening["test_listen_network_query_"..test.name] = function()
local bc1 = BaseControl:new()
local addr1 = network.get_scene()
local noun = "lnq"..test.name.."1"
bc1:register(noun, 0)
bc1:finalize()
local bc2 = BaseControl:new()
local addr2 = network.get_scene()
local tmp, n = 0, 0
bc2:listen(noun, test.query, function(new)
assert_equal(tmp, new, "value did not propagate")
n = n + 1
end)
network.set_scene(addr1)
assert_equal(0, n, "wrong number of listener invokations")
tmp = test.pos1
bc1:set(noun, test.pos1)
assert_equal(1, n, "wrong number of listener invokations")
tmp = test.neg
bc1:set(noun, test.neg)
assert_equal(1, n, "wrong number of listener invokations")
tmp = test.pos2
bc1:set(noun, test.pos2)
assert_equal(2, n, "wrong number of listener invokations")
bc1:close()
network.set_scene(addr2)
bc2:close()
end
end
end