/ tests / test_state.lua
test_state.lua
  1  local Kind = require("src.core.kind")
  2  local World = require("src.core.world")
  3  local Belts = require("src.core.belts")
  4  local Machines = require("src.core.machines")
  5  local Power = require("src.core.power")
  6  local Inserters = require("src.core.inserters")
  7  local Player = require("src.core.player")
  8  local Item = require("src.core.item")
  9  local State = require("src.core.state")
 10  
 11  local T = {}
 12  
 13  local function worlds_equal(a, b)
 14    if a.w ~= b.w or a.h ~= b.h then
 15      return false
 16    end
 17    for i = 1, a.w * a.h do
 18      if a.cells[i] ~= b.cells[i] then
 19        return false
 20      end
 21    end
 22    return true
 23  end
 24  
 25  function T.test_seeded_generation_is_deterministic()
 26    local w1 = World.new(64, 36, Kind.EMPTY)
 27    local w2 = World.new(64, 36, Kind.EMPTY)
 28    local w3 = World.new(64, 36, Kind.EMPTY)
 29  
 30    w1:generate_patches(12345)
 31    w2:generate_patches(12345)
 32    w3:generate_patches(54321)
 33  
 34    assert(worlds_equal(w1, w2) == true)
 35    assert(worlds_equal(w1, w3) == false)
 36  end
 37  
 38  function T.test_state_round_trip()
 39    local w = World.new(7, 3, Kind.EMPTY, 4)
 40    w:set(1, 1, Kind.IRON_ORE)
 41  
 42    local belts = Belts.new(w)
 43    belts:place(Kind.BELT_RIGHT, 2, 1)
 44    belts:place(Kind.BELT_RIGHT, 3, 1)
 45    belts:place(Kind.BELT_RIGHT, 5, 1)
 46    belts:place(Kind.SPLITTER_RIGHT, 1, 2)
 47    belts:place(Kind.BELT_RIGHT, 2, 2)
 48    belts:place(Kind.BELT_RIGHT, 4, 2)
 49    belts:place(Kind.BELT_DOWN, 1, 3)
 50    belts:place(Kind.BELT_RIGHT, 3, 3)
 51    belts:place(Kind.BELT_RIGHT, 4, 3)
 52    belts:place(Kind.UNDERGROUND_IN_RIGHT, 6, 1)
 53    belts:place(Kind.UNDERGROUND_OUT_RIGHT, 7, 1)
 54  
 55    local power = Power.new(w)
 56    power:place(Kind.GENERATOR, 6, 2)
 57    power:place(Kind.POWER_POLE, 5, 2)
 58    power:rebuild()
 59  
 60    local inserters = Inserters.new(w, belts, power)
 61    inserters:place(Kind.INSERTER_RIGHT, 3, 2)
 62  
 63    local machines = Machines.new(w, belts, power)
 64    machines:place(Machines.kind_for("miner", "right"), 1, 1)
 65    machines:place(Machines.kind_for("furnace", "right"), 4, 1)
 66    machines:place(Machines.kind_for("assembler", "right"), 2, 3)
 67  
 68    belts:set_item(1, 2, Item.IRON_ORE)
 69    belts:set_item(3, 1, Item.IRON_ORE)
 70    belts:set_item(1, 3, Item.IRON_PLATE)
 71    belts:set_item(6, 1, Item.COAL)
 72    belts:step()
 73  
 74    local furnace = machines:state_at(4, 1)
 75    furnace.input_item = Item.IRON_ORE
 76    furnace.progress = 1
 77  
 78    local assembler = machines:state_at(2, 3)
 79    assembler.buffer[Item.IRON_PLATE] = 1
 80    assembler.progress = 2
 81  
 82    local player = Player.new(2, 2)
 83    player.inv.iron_ore = 3
 84  
 85    local seed = 2468
 86    local saved = State.capture(w, belts, machines, player, seed)
 87    local encoded = State.encode(saved)
 88    local decoded = State.decode(encoded)
 89    local restored = State.restore(decoded)
 90  
 91    assert(restored.seed == seed)
 92    assert(restored.world.chunk_size == 4)
 93    assert(restored.world:get(1, 1) == Machines.kind_for("miner", "right"))
 94    assert(restored.belts:item_at(3, 1) == Item.IRON_ORE)
 95    assert(restored.belts:item_at(7, 1) == Item.COAL)
 96    assert(restored.power:is_powered(6, 2) == true)
 97    assert(Inserters.is_inserter_kind(restored.world:get(3, 2)) == true)
 98  
 99    local rfurnace = restored.machines:state_at(4, 1)
100    assert(rfurnace and rfurnace.progress == 1)
101  
102    local rassembler = restored.machines:state_at(2, 3)
103    assert(rassembler and (rassembler.buffer[Item.IRON_PLATE] or 0) == 1)
104  
105    local path = "tests/tmp_save.lua"
106    local ok = State.write(path, encoded)
107    assert(ok == true)
108    local read_back = State.read(path)
109    assert(read_back == encoded)
110    os.remove(path)
111  end
112  
113  return T