commit e6e293bce64c094e1fc8a69b021ba4526c231cd4 Author: Axel Meyer Date: Thu May 14 17:05:23 2026 +0200 feat(P.3.7): lib-core.command-test v0.1.0 โ€” 21 state assertions diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..00867c2 --- /dev/null +++ b/init.lua @@ -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 diff --git a/manifest.core b/manifest.core new file mode 100644 index 0000000..e9cff30 --- /dev/null +++ b/manifest.core @@ -0,0 +1,6 @@ +{ + "id": "lib-core.command-test.core", + "kind": "lib", + "version": "0.1.0", + "license": "Proprietary" +} diff --git a/manifest.module b/manifest.module new file mode 100644 index 0000000..28ffcf9 --- /dev/null +++ b/manifest.module @@ -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" } + ] +}