aboutsummaryrefslogtreecommitdiff
path: root/advtrains_interlocking/spec
diff options
context:
space:
mode:
authorY. Wang <yw05@forksworld.de>2023-03-26 11:53:00 +0200
committerY. Wang <yw05@forksworld.de>2023-03-26 11:53:00 +0200
commite25b1c744dad7daa561ee0b23b006bc616f88f23 (patch)
treed4d27772f8f4d1c2518dc9afd0b0f80bff849aa5 /advtrains_interlocking/spec
parente61fe3176a2ef9c41a3fe16a3ffd58bd03fd96a6 (diff)
downloadadvtrains-e25b1c744dad7daa561ee0b23b006bc616f88f23.tar.gz
advtrains-e25b1c744dad7daa561ee0b23b006bc616f88f23.tar.bz2
advtrains-e25b1c744dad7daa561ee0b23b006bc616f88f23.zip
Cancel type 2 signals; introduce signal groups for all signals
Diffstat (limited to 'advtrains_interlocking/spec')
-rw-r--r--advtrains_interlocking/spec/basic_signalling_spec.lua26
-rw-r--r--advtrains_interlocking/spec/signal_group_spec.lua95
-rw-r--r--advtrains_interlocking/spec/type2_spec.lua117
3 files changed, 110 insertions, 128 deletions
diff --git a/advtrains_interlocking/spec/basic_signalling_spec.lua b/advtrains_interlocking/spec/basic_signalling_spec.lua
index cce0f15..a4e1e3a 100644
--- a/advtrains_interlocking/spec/basic_signalling_spec.lua
+++ b/advtrains_interlocking/spec/basic_signalling_spec.lua
@@ -8,7 +8,7 @@ mineunit("core")
_G.advtrains = {
interlocking = {
- aspects = fixture("../../signal_aspects"),
+ aspect = fixture("../../aspect"),
},
ndb = {
get_node = minetest.get_node,
@@ -31,12 +31,16 @@ minetest.register_node("advtrains_interlocking:signal_sign", {
local D = advtrains.distant
local I = advtrains.interlocking
+local A = I.aspect
local stub_aspect_t1 = {
free = {main = -1},
slow = {main = 6},
danger = {main = 0, shunt = false},
}
+for k, v in pairs(stub_aspect_t1) do
+ stub_aspect_t1[k] = A(v)
+end
local stub_pos_t1 = {}
for i = 1, 4 do
stub_pos_t1[i] = {x = 1, y = 0, z = i}
@@ -55,14 +59,14 @@ describe("API for supposed signal aspects", function()
I.load_supposed_aspects(tbl)
assert.same(tbl, I.save_supposed_aspects())
end)
- it("should set and get type 1 signals properly", function ()
+ it("should set and get signals properly", function ()
local pos = stub_pos_t1[2]
local asp = stub_aspect_t1.slow
- local newasp = { main = math.random(1,5) }
- assert.same(asp, I.signal_get_aspect(pos))
+ local newasp = A{ main = math.random(1,5) }
+ assert.equal(asp, I.signal_get_aspect(pos))
I.signal_set_aspect(pos, newasp)
- assert.same(newasp, I.signal_get_aspect(pos))
- assert.same(asp, I.signal_get_real_aspect(pos))
+ assert.equal(newasp, I.signal_get_aspect(pos))
+ assert.equal(asp, I.signal_get_real_aspect(pos))
I.signal_set_aspect(pos, asp)
end)
end)
@@ -72,9 +76,9 @@ describe("Distant signaling", function()
for i = 1, 2 do
D.assign(stub_pos_t1[i], stub_pos_t1[i+1])
end
- assert.same(stub_aspect_t1.danger, I.signal_get_aspect(stub_pos_t1[1]))
- assert.same({main = 6, dst = 0}, I.signal_get_aspect(stub_pos_t1[2]))
- assert.same({main = -1, dst = 6}, I.signal_get_aspect(stub_pos_t1[3]))
+ assert.equal(stub_aspect_t1.danger, I.signal_get_aspect(stub_pos_t1[1]))
+ assert.equal(A{main = 6, dst = 0}, I.signal_get_aspect(stub_pos_t1[2]))
+ assert.equal(A{main = -1, dst = 6}, I.signal_get_aspect(stub_pos_t1[3]))
end)
it("should report assignments properly", function()
assert.same({stub_pos_t1[1], "manual"}, {D.get_main(stub_pos_t1[2])})
@@ -82,8 +86,8 @@ describe("Distant signaling", function()
end)
it("should update distant aspects automatically", function()
I.signal_set_aspect(stub_pos_t1[2], {main = 2, dst = -1})
- assert.same({main = 2, dst = 0}, I.signal_get_aspect(stub_pos_t1[2]))
- assert.same({main = -1, dst = 2}, I.signal_get_aspect(stub_pos_t1[3]))
+ assert.equal(A{main = 2, dst = 0}, I.signal_get_aspect(stub_pos_t1[2]))
+ assert.equal(A{main = -1, dst = 2}, I.signal_get_aspect(stub_pos_t1[3]))
end)
it("should unassign signals when one is removed", function()
world.set_node(stub_pos_t1[2], "air")
diff --git a/advtrains_interlocking/spec/signal_group_spec.lua b/advtrains_interlocking/spec/signal_group_spec.lua
new file mode 100644
index 0000000..bc9d007
--- /dev/null
+++ b/advtrains_interlocking/spec/signal_group_spec.lua
@@ -0,0 +1,95 @@
+require "mineunit"
+mineunit("core")
+
+_G.advtrains = {
+ interlocking = {
+ aspect = sourcefile("aspect"),
+ },
+ ndb = {
+ get_node = minetest.get_node,
+ swap_node = minetest.swap_node,
+ }
+}
+
+fixture("advtrains_helpers")
+sourcefile("database")
+sourcefile("signal_api")
+sourcefile("distant")
+sourcefile("signal_aspect_accessors")
+
+local A = advtrains.interlocking.aspect
+local D = advtrains.distant
+local I = advtrains.interlocking
+local N = advtrains.ndb
+
+local groupdef = {
+ name = "foo",
+ aspects = {
+ proceed = {main = -1},
+ caution = {},
+ danger = {main = 0},
+ "proceed",
+ {"caution"},
+ "danger",
+ },
+}
+
+for k, v in pairs(groupdef.aspects) do
+ minetest.register_node("advtrains_interlocking:" .. k, {
+ advtrains = {
+ supported_aspects = {
+ group = "foo",
+ },
+ get_aspect = function() return A{group = "foo", name = k} end,
+ set_aspect = function(pos, _, name)
+ N.swap_node(pos, {name = "advtrains_interlocking:" .. name})
+ end,
+ }
+ })
+end
+
+local origin = vector.new(0, 0, 0)
+local dstpos = vector.new(0, 0, 1)
+
+world.layout {
+ {origin, "advtrains_interlocking:danger"},
+ {dstpos, "advtrains_interlocking:proceed"},
+}
+
+describe("signal group registration", function()
+ it("should work", function()
+ A.register_group(groupdef)
+ assert(A.get_group_definition("foo"))
+ end)
+ it("should only be allowed once for the same group", function()
+ assert.has.errors(function() A.register_group(type2def) end)
+ end)
+ it("should handle nonexistant groups", function()
+ assert.is_nil(A.get_group_definition("something_else"))
+ end)
+ it("should reject invalid definitions", function()
+ assert.has.errors(function() A.register_group({}) end)
+ assert.has.errors(function() A.register_group({name="",label={}}) end)
+ assert.has.errors(function() A.register_group({name="",aspects={}}) end)
+ end)
+end)
+
+describe("signal aspect", function()
+ it("should handle empty fields properly", function()
+ assert.equal(A{main = 0}, A{group="foo", name="danger"}:to_group())
+ end)
+ it("should be converted properly", function()
+ assert.equal(A{main = 0}, A{group="foo", name="danger"})
+ assert.equal(A{}, A{group="foo", name="caution"})
+ assert.equal(A{main = -1}, A{group="foo", name="proceed"})
+ end)
+end)
+
+describe("signals in groups", function()
+ it("should support distant signaling", function()
+ assert.equal("caution", A():adjust_distant(A{group="foo",name="danger"}).name)
+ assert.equal("proceed", A():adjust_distant(A{group="foo",name="caution"}).name)
+ assert.equal("proceed", A():adjust_distant(A{group="foo",name="proceed"}).name)
+ assert.equal("danger", A{group="foo",name="danger"}:adjust_distant{}.name)
+ end)
+end)
diff --git a/advtrains_interlocking/spec/type2_spec.lua b/advtrains_interlocking/spec/type2_spec.lua
deleted file mode 100644
index ac23574..0000000
--- a/advtrains_interlocking/spec/type2_spec.lua
+++ /dev/null
@@ -1,117 +0,0 @@
-require "mineunit"
-mineunit("core")
-
-_G.advtrains = {
- interlocking = {
- aspects = sourcefile("signal_aspects"),
- },
- ndb = {
- get_node = minetest.get_node,
- swap_node = minetest.swap_node,
- }
-}
-
-fixture("advtrains_helpers")
-sourcefile("database")
-sourcefile("signal_api")
-sourcefile("distant")
-sourcefile("signal_aspect_accessors")
-
-local A = advtrains.interlocking.aspects
-local D = advtrains.distant
-local I = advtrains.interlocking
-local N = advtrains.ndb
-
-local type2def = {
- name = "foo",
- main = {
- {name = "proceed", main = -1},
- {name = "caution"},
- {name = "danger", main = 0},
- },
-}
-
-for _, v in pairs(type2def.main) do
- minetest.register_node("advtrains_interlocking:" .. v.name, {
- advtrains = {
- supported_aspects = {
- type = 2,
- group = "foo",
- },
- get_aspect = function() return v.name end,
- set_aspect = function(pos, _, name)
- N.swap_node(pos, {name = "advtrains_interlocking:" .. name})
- end,
- }
- })
-end
-
-local function asp(group, name, dst)
- return A.type2_to_type1({group = group, dst_shift = shift}, name)
-end
-
-local origin = vector.new(0, 0, 0)
-local dstpos = vector.new(0, 0, 1)
-
-world.layout {
- {origin, "advtrains_interlocking:danger"},
- {dstpos, "advtrains_interlocking:proceed"},
-}
-
-describe("type 2 signal group registration", function()
- it("should work", function()
- A.register_type2(type2def)
- assert(A.get_type2_definition("foo"))
- end)
- it("should only be allowed once for the same group", function()
- assert.has.errors(function() A.register_type2(type2def) end)
- end)
- it("should handle nonexistant groups", function()
- assert.is_nil(A.get_type2_definition("something_else"))
- end)
- it("should reject invalid definitions", function()
- assert.has.errors(function() A.register_type2({}) end)
- assert.has.errors(function() A.register_type2({name="",label={}}) end)
- assert.has.errors(function() A.register_type2({name="",main={{name={}}}}) end)
- assert.has.errors(function() A.register_type2({name="",main={{name="",label={}}}}) end)
- end)
-end)
-
-describe("signal aspect conversion", function()
- it("should work for converting from type 1 to type 2", function()
- assert.equal("danger", A.type1_to_type2main({main = 0}, "foo"))
- assert.equal("caution", A.type1_to_type2main({main = 6}, "foo"))
- assert.equal("proceed", A.type1_to_type2main({}, "foo"))
- end)
- it("should reject invalid type 2 signal information", function()
- assert.is_nil(A.type1_to_type2main({}, "?"))
- assert.is_nil(A.type2_to_type1({}, "x"))
- assert.same(asp("foo","caution"), asp("foo", "x"))
- end)
- it("should accept integer indices for type 2 signal aspects", function()
- assert.same(asp("foo", "caution"), asp("foo", 2))
- assert.same(asp("foo", "danger"), asp("foo", 10))
- assert.same(asp("foo", "proceed"), asp("foo", 1))
- assert.is_nil(asp("foo", -0.5))
- end)
-end)
-
-describe("type 2 signals", function()
- it("should support distant signaling", function()
- assert.equal("caution", A.get_type2_dst("foo", 3))
- assert.equal("proceed", A.get_type2_dst("foo", "caution"))
- assert.equal("proceed", A.get_type2_dst("foo", "proceed"))
- end)
- it("should work with accessors", function()
- assert.same(asp("foo","danger"), I.signal_get_aspect(origin))
- local newasp = {type2group = "foo", type2name = "proceed", main = 6}
- I.signal_set_aspect(origin, newasp)
- assert.same(newasp, I.signal_get_aspect(origin))
- end)
- it("should work with distant signaling", function()
- assert.same(asp("foo","proceed"), I.signal_get_aspect(dstpos))
- local dstasp = {type2group = "foo", type2name = "proceed", dst = 6, main = -1}
- D.assign(origin, dstpos)
- assert.same(dstasp, I.signal_get_aspect(dstpos))
- end)
-end)