feat(P.3.7): lib-core.command-test v0.1.0 — 21 state assertions
This commit is contained in:
87
init.lua
Normal file
87
init.lua
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
-- lib-core.command-test — pure-state assertions via engine.test.
|
||||||
|
-- See meta/docs/superpowers/specs/2026-05-14-p3-7-lib-command-design.md §5.
|
||||||
|
|
||||||
|
local command = require("lib-core.command")
|
||||||
|
local T = engine.test
|
||||||
|
|
||||||
|
function init(ctx)
|
||||||
|
-- Mocked-Unit Helper: closure-state simulates a module's unit-state.
|
||||||
|
local function make_unit(x0, y0, speed)
|
||||||
|
local state = { x = x0, y = y0 }
|
||||||
|
local h = command.register(
|
||||||
|
function() return { x = state.x, y = state.y } end,
|
||||||
|
function(nx, ny) state.x = nx; state.y = ny end,
|
||||||
|
speed
|
||||||
|
)
|
||||||
|
return h, state
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Register / Unregister (3)
|
||||||
|
local h1, s1 = make_unit(0, 0, 100)
|
||||||
|
T.assert(h1 ~= nil and h1 >= 1, "register returns positive handle")
|
||||||
|
T.equals(command.count_registered(), 1, "count_registered after register")
|
||||||
|
command.unregister(h1)
|
||||||
|
T.equals(command.count_registered(), 0, "count_registered after unregister")
|
||||||
|
|
||||||
|
-- Re-register for further tests
|
||||||
|
local h2, s2 = make_unit(0, 0, 100)
|
||||||
|
local h3, s3 = make_unit(0, 0, 200)
|
||||||
|
|
||||||
|
-- Move-Issue + State-Query (3)
|
||||||
|
command.move_to({h2}, 100, 0)
|
||||||
|
local cur = command.current(h2)
|
||||||
|
T.assert(cur ~= nil and cur.type == "move"
|
||||||
|
and cur.target_x == 100 and cur.target_y == 0,
|
||||||
|
"current returns move-command data after move_to")
|
||||||
|
T.assert(command.is_moving(h2), "is_moving true after move_to")
|
||||||
|
T.assert(not command.is_moving(h3), "is_moving false for idle unit")
|
||||||
|
|
||||||
|
-- State-Query bei idle (2)
|
||||||
|
T.assert(command.current(h3) == nil, "current returns nil for idle unit")
|
||||||
|
T.assert(not command.is_moving(99999), "is_moving false for unknown handle")
|
||||||
|
|
||||||
|
-- Update-step (2): unit moves toward target
|
||||||
|
s2.x, s2.y = 0, 0 -- reset
|
||||||
|
command.move_to({h2}, 100, 0)
|
||||||
|
command.update(0.1) -- 100 px/s * 0.1s = 10 px step
|
||||||
|
T.equals(s2.x, 10, "update moves 10px in 0.1s @ 100 px/s")
|
||||||
|
T.equals(s2.y, 0, "y unchanged for horizontal move")
|
||||||
|
|
||||||
|
-- Arrival-snap (2): step >= dist clears + snaps
|
||||||
|
s2.x, s2.y = 0, 0
|
||||||
|
command.move_to({h2}, 5, 0)
|
||||||
|
command.update(0.1) -- step = 10 >= dist = 5 → snap + clear
|
||||||
|
T.equals(s2.x, 5, "arrival snap to target.x")
|
||||||
|
T.assert(command.current(h2) == nil, "arrival clears active command")
|
||||||
|
|
||||||
|
-- Cancel + cancel_all (3)
|
||||||
|
s2.x, s2.y = 0, 0
|
||||||
|
command.move_to({h2, h3}, 1000, 0)
|
||||||
|
command.cancel(h2)
|
||||||
|
T.assert(command.current(h2) == nil, "cancel clears command on h2")
|
||||||
|
T.assert(command.current(h3) ~= nil, "cancel doesn't affect h3")
|
||||||
|
command.cancel_all()
|
||||||
|
T.assert(command.current(h3) == nil, "cancel_all clears remaining")
|
||||||
|
|
||||||
|
-- Speed-Setter (2)
|
||||||
|
T.equals(command.speed(h2), 100, "speed from register")
|
||||||
|
command.set_speed(h2, 250)
|
||||||
|
T.equals(command.speed(h2), 250, "set_speed updates")
|
||||||
|
|
||||||
|
-- Arrive-Threshold + Enabled (3)
|
||||||
|
T.equals(command.arrive_threshold(), 2, "default threshold = 2")
|
||||||
|
command.set_arrive_threshold(5)
|
||||||
|
T.equals(command.arrive_threshold(), 5, "set_arrive_threshold writes")
|
||||||
|
T.assert(command.enabled(), "enabled default true")
|
||||||
|
command.set_enabled(false)
|
||||||
|
T.assert(not command.enabled(), "set_enabled(false) writes")
|
||||||
|
command.set_enabled(true)
|
||||||
|
|
||||||
|
-- Error-Handling (2)
|
||||||
|
local ok1 = pcall(function()
|
||||||
|
command.register("not a function", function() end, 100)
|
||||||
|
end)
|
||||||
|
T.assert(not ok1, "register with non-function errors")
|
||||||
|
local ok2 = pcall(function() command.move_to({99999}, 0, 0) end)
|
||||||
|
T.assert(not ok2, "move_to with unknown handle errors")
|
||||||
|
end
|
||||||
6
manifest.core
Normal file
6
manifest.core
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"id": "lib-core.command-test.core",
|
||||||
|
"kind": "lib",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"license": "Proprietary"
|
||||||
|
}
|
||||||
12
manifest.module
Normal file
12
manifest.module
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"id": "lib-core.command-test",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"kind": "test-module",
|
||||||
|
"api": "^0.1",
|
||||||
|
"entry_point": "init.lua",
|
||||||
|
"deps": [
|
||||||
|
{ "id": "lib-core.command", "version": "0.1.0" },
|
||||||
|
{ "id": "lib-core.input", "version": "0.3.0" },
|
||||||
|
{ "id": "lib-core.camera", "version": "0.3.0" }
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user