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