From ecdbe2d8ed89dcf40018355cc480a51985522a7c Mon Sep 17 00:00:00 2001 From: Ukendio Date: Wed, 21 Aug 2024 01:59:25 +0200 Subject: [PATCH] Add tests for scheduler example --- test/tests.luau | 247 ++++++++++++++++++++++++++++++ thesis/drafts/1/paper.fdb_latexmk | 12 +- thesis/drafts/1/paper.log | 2 +- thesis/drafts/1/paper.pdf | Bin 600187 -> 600187 bytes 4 files changed, 254 insertions(+), 7 deletions(-) diff --git a/test/tests.luau b/test/tests.luau index 30fc3f4..2b6c68c 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -1243,4 +1243,251 @@ TEST("Hooks", function() end end) + +TEST("scheduler", function() + type System = { + callback: (world: World) -> () + } + type Systems = { System } + + + type Events = { + RenderStepped: Systems, + Heartbeat: Systems + } + + local scheduler_new: (w: World) -> { + components: { + Disabled: Entity, + System: Entity, + Phase: Entity, + DependsOn: Entity + }, + + systems: { + collect: { + under_event: (event: Entity) -> Systems, + all: () -> Events + }, + run: (events: Events) -> () + }, + + phases: { + RenderStepped: Entity, + Heartbeat: Entity + }, + + phase: (after: Entity) -> Entity + } + + do + local world + local Disabled + local System + local DependsOn + local Phase + local RenderStepped + local Heartbeat + + local function scheduler_collect_systems_under_phase_recursive(systems, phase) + for _, system in world:query(System):with(pair(DependsOn, phase)) do + table.insert(systems, system) + end + for dependant in world:query(Phase):with(pair(DependsOn, phase)) do + scheduler_collect_systems_under_phase_recursive(systems, dependant) + end + end + + local function scheduler_collect_systems_under_event(event) + local systems = {} + scheduler_collect_systems_under_phase_recursive(systems, event) + return systems + end + + local function scheduler_collect_systems_all() + local systems = { + RenderStepped = scheduler_collect_systems_under_event( + RenderStepped), + Heartbeat = scheduler_collect_systems_under_event( + Heartbeat) + } + return systems + end + + local function scheduler_run_systems(events) + for _, system in events.RenderStepped do + system.callback(world) + end + for _, system in events.Heartbeat do + system.callback(world) + end + end + + local function scheduler_phase_new(after) + local phase = world:entity() + world:add(phase, Phase) + local dependency = pair(DependsOn, after) + world:add(phase, dependency) + return phase + end + + local function scheduler_systems_new(callback, phase) + local system = world:entity() + world:set(system, System, { callback = callback }) + world:add(system, pair(DependsOn, phase)) + return system + end + + function scheduler_new(w) + world = w + Disabled = world:component() + System = world:component() + Phase = world:component() + DependsOn = world:component() + + RenderStepped = world:component() + Heartbeat = world:component() + + world:add(RenderStepped, Phase) + world:add(Heartbeat, Phase) + + return { + phase = scheduler_phase_new, + + phases = { + RenderStepped = RenderStepped, + Heartbeat = Heartbeat, + }, + + world = world, + + collect_systems = { + under_event = scheduler_collect_systems_under_event, + all = scheduler_collect_systems_all + }, + + run_systems = scheduler_run_systems, + + components = { + DependsOn = DependsOn, + Disabled = Disabled, + Heartbeat = Heartbeat, + Phase = Phase, + RenderStepped = RenderStepped, + System = System, + }, + + systems = { + run = scheduler_run_systems, + collect = { + under_event = scheduler_collect_systems_under_event, + all = scheduler_collect_systems_all + }, + new = scheduler_systems_new, + } + } + end + end + + do CASE "event dependant phase" + + local world = jecs.World.new() + local scheduler = scheduler_new(world) + local components = scheduler.components + local phases = scheduler.phases + local Heartbeat = phases.Heartbeat + local DependsOn = components.DependsOn + + local Physics = scheduler.phase(Heartbeat) + CHECK(world:target(Physics, DependsOn) == Heartbeat) + end + + do CASE "user-defined sub phases" + local world = jecs.World.new() + local scheduler = scheduler_new(world) + local components = scheduler.components + local phases = scheduler.phases + local DependsOn = components.DependsOn + + local A = scheduler.phase(phases.Heartbeat) + local B = scheduler.phase(A) + + CHECK(world:target(B, DependsOn) == A) + end + + do CASE "phase order" + local world = jecs.World.new() + local scheduler = scheduler_new(world) + + local phases = scheduler.phases + local Physics = scheduler.phase(phases.Heartbeat) + local Collisions = scheduler.phase(Physics) + + local order = "BEGIN" + + local function move() + order ..= "->move" + end + + local function hit() + order ..= "->hit" + end + + local createSystem = scheduler.systems.new + + createSystem(hit, Collisions) + createSystem(move, Physics) + + local events = scheduler.systems.collect.all() + scheduler.systems.run(events) + + order ..= "->END" + + CHECK(order == "BEGIN->move->hit->END") + end + + do CASE "collect only systems under phase recursive" + local world = jecs.World.new() + local scheduler = scheduler_new(world) + local phases = scheduler.phases + local Heartbeat = phases.Heartbeat + local RenderStepped = phases.RenderStepped + local Render = scheduler.phase(RenderStepped) + local Physics = scheduler.phase(Heartbeat) + local Collisions = scheduler.phase(Physics) + + local function move() + end + + local function hit() + end + + local function camera() + end + + local createSystem = scheduler.systems.new + + createSystem(hit, Collisions) + createSystem(move, Physics) + createSystem(camera, Render) + + local systems = scheduler.systems.collect.under_event(Collisions) + + CHECK(#systems == 1) + CHECK(systems[1].callback == hit) + + systems = scheduler.systems.collect.under_event(Physics) + + CHECK(#systems == 2) + + systems = scheduler.systems.collect.under_event(Heartbeat) + + CHECK(#systems == 2) + + systems = scheduler.systems.collect.under_event(Render) + + CHECK(#systems == 1) + CHECK(systems[1].callback == camera) + end +end) FINISH() diff --git a/thesis/drafts/1/paper.fdb_latexmk b/thesis/drafts/1/paper.fdb_latexmk index d2944b5..f990f20 100644 --- a/thesis/drafts/1/paper.fdb_latexmk +++ b/thesis/drafts/1/paper.fdb_latexmk @@ -1,5 +1,5 @@ # Fdb version 4 -["pdflatex"] 1722383502.05394 "c:/Users/Marcus/Documents/packages/jecs/thesis/drafts/1/paper.tex" "paper.pdf" "paper" 1722383503.46586 0 +["pdflatex"] 1724165754.00483 "c:/Users/Marcus/Documents/packages/jecs/thesis/drafts/1/paper.tex" "paper.pdf" "paper" 1724165755.21979 0 "../../images/archetype_graph.png" 1709688578 50172 8f93f7d24d4920bd8720f4b480771eb4 "" "../../images/insertion.png" 1720373630 158773 c2f9fb7fae25fea3afb7e426b1d318d6 "" "../../images/queries.png" 1720373630 205571 d976c9319fb29ae7dffc46ded3de4e55 "" @@ -152,12 +152,12 @@ "C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/url/url.sty" 1388490452 12796 8edb7d69a20b857904dd0ea757c14ec9 "" "C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/xcolor/xcolor.sty" 1700127522 55487 80a65caedd3722f4c20a14a69e785d8f "" "C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/xkeyval/xkeyval.sty" 1656236919 4937 4ce600ce9bd4ec84d0250eb6892fcf4f "" - "c:/Users/Marcus/Documents/packages/jecs/thesis/drafts/1/paper.tex" 1722383500 33628 2358f35913ab57bac270409214a52615 "" + "c:/Users/Marcus/Documents/packages/jecs/thesis/drafts/1/paper.tex" 1722532428 33628 2358f35913ab57bac270409214a52615 "" "listings-rust.sty" 1720461559 12349 f346af5561f91e34970cbe0b79654ec2 "" - "paper.aux" 1722383503 5596 e71f1baf7c13471206b3537d383c78e2 "pdflatex" - "paper.out" 1722383503 3695 a11dbc9d88dd30c22755dc5ebf6964ec "pdflatex" - "paper.tex" 1722383500 33628 2358f35913ab57bac270409214a52615 "" - "paper.toc" 1722383503 3025 f0a34bc8923dbdfdaeb8258045835a7e "pdflatex" + "paper.aux" 1724165755 5596 e71f1baf7c13471206b3537d383c78e2 "pdflatex" + "paper.out" 1724165755 3695 a11dbc9d88dd30c22755dc5ebf6964ec "pdflatex" + "paper.tex" 1722532428 33628 2358f35913ab57bac270409214a52615 "" + "paper.toc" 1724165755 3025 f0a34bc8923dbdfdaeb8258045835a7e "pdflatex" (generated) "paper.aux" "paper.log" diff --git a/thesis/drafts/1/paper.log b/thesis/drafts/1/paper.log index 428e6f0..4163130 100644 --- a/thesis/drafts/1/paper.log +++ b/thesis/drafts/1/paper.log @@ -1,4 +1,4 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.25 (MiKTeX 24.1) (preloaded format=pdflatex 2024.4.4) 31 JUL 2024 01:51 +This is pdfTeX, Version 3.141592653-2.6-1.40.25 (MiKTeX 24.1) (preloaded format=pdflatex 2024.4.4) 20 AUG 2024 16:55 entering extended mode restricted \write18 enabled. file:line:error style messages enabled. diff --git a/thesis/drafts/1/paper.pdf b/thesis/drafts/1/paper.pdf index 8f7b506077c70319c83c60c4931dd40a9745c0d6..7af265f1e1f153ac402ab736d66a3650426dcd2c 100644 GIT binary patch delta 131 zcmex;LFM-am4+6^7N!>F7M2#)7Pc1l7LF~PCs;Twj0_CTOifKqre9>?ltOT~e_`QN xS9W$YG_rJaHZ^lJwXiTVb#--fHF7gCGcqtYF)=rHGB&VNupy*mdYlHQEC8_jA^QLT delta 131 zcmex;LFM-am4+6^7N!>F7M2#)7Pc1l7LF~PCs;VmjSUS9O$|+qre9>?ltOT~e_`QN xS9UhGv~YEFaWil-u{1O`GdD9gbul+^b96K|G&C?UF?F+3upy*mdYlHQEC8W3A-Mnm