mission_ember_encounter_test.lua 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package.path = "scripts/?.lua;" .. package.path
  2. local Encounter = require("mission_ember.encounter")
  3. local function fixture()
  4. local vars, calls = {}, {placed = 0, cleared = 0}
  5. local slots = {
  6. a = {registry_key = 5, slot_type = 1, slot_index = 0},
  7. b = {registry_key = 6, slot_type = 1, slot_index = 0},
  8. }
  9. local context = {sdk = {squad_modes = {replace = "replace"}}}
  10. local state = {variable = function(_, key) return vars[key] end}
  11. function context:set_variable(key, value) vars[key] = value end
  12. function context:clear_variable(key) vars[key] = nil end
  13. function context:slot(id) return assert(slots[id]) end
  14. function context:squad(id)
  15. assert(slots[id])
  16. return {default_counts = {1}, place = function(_, args)
  17. assert(args.mode == "replace")
  18. calls.placed = calls.placed + 1
  19. end}
  20. end
  21. local function make()
  22. return Encounter.new("test", {{name = "a", id = "a", sensor = "a"},
  23. {name = "b", id = "b", sensor = "b"}},
  24. function() calls.cleared = calls.cleared + 1 end)
  25. end
  26. local encounter = make()
  27. local function event(id, count, previous, removal)
  28. local slot = slots[id]
  29. encounter:on_squad_state(context, state, {
  30. registry_key = slot.registry_key, slot_type = slot.slot_type,
  31. slot_index = slot.slot_index, alive_count = count,
  32. previous_alive_count = previous, removal_flag = removal,
  33. })
  34. end
  35. return context, state, encounter, calls, event, make
  36. end
  37. do
  38. local context, state, encounter, calls, event = fixture()
  39. assert(encounter:enter(context, state))
  40. assert(not encounter:enter(context, state))
  41. assert(calls.placed == 2)
  42. event("a", 0, 0); event("b", 0, 0)
  43. assert(calls.cleared == 0)
  44. event("a", 1, 0); event("b", 1, 0)
  45. event("a", 0, 1); event("a", 0, 1)
  46. assert(calls.cleared == 0)
  47. event("b", 0, 1, true)
  48. assert(calls.cleared == 0)
  49. event("b", 0, 0)
  50. assert(calls.cleared == 0)
  51. event("b", 1, 0)
  52. event("b", 0, 1)
  53. assert(calls.cleared == 1 and encounter:phase(state) == 2)
  54. event("b", 0, 1)
  55. assert(calls.cleared == 1)
  56. encounter:reset(context)
  57. assert(encounter:enter(context, state) and calls.placed == 4)
  58. event("a", 0, 0); event("b", 0, 0)
  59. assert(calls.cleared == 1)
  60. end
  61. do
  62. local context, state, encounter, calls, event, make = fixture()
  63. encounter:enter(context, state)
  64. event("a", 1, 0)
  65. local reloaded = make()
  66. assert(not reloaded:enter(context, state) and calls.placed == 2)
  67. -- A death edge with a positive prior count proves a squad existed even if its spawn edge
  68. -- was outside the callback history. Both squads still have to be accounted for.
  69. event("a", 0, 1); event("b", 0, 1)
  70. assert(calls.cleared == 1)
  71. end
  72. do
  73. local context, state, encounter, calls = fixture()
  74. function context:squad() error("SDK binding is not runnable") end
  75. assert(not pcall(function() encounter:enter(context, state) end))
  76. assert(calls.placed == 0 and encounter:phase(state) == 0)
  77. end
  78. print("encounter progression, replay, reload, removal and SDK refusal checks passed")