// describe "foggify/2" { // test "obscures opposing tiles" { // city = Tile.City.create() // base = Tile.Base.create() // game = build(:game, %{ // map_settings: build(:map_settings, %{ // use_fog: true // }), // map_data: "34,34,34,34,34\n35,35,35,35,35\n36,36,36,36,36\n37,37,37,37,37\n42,42,42,42,42", // map_type: "cardinal", // unit_data: [ // build(:unit_data, %{team: 2, coord: Coord {x: 0, y: 0}}), // build(:unit_data, %{team: 3, coord: Coord {x: 1, y: 0}}), // build(:unit_data, %{team: 4, coord: Coord {x: 2, y: 0}}), // build(:unit_data, %{team: 5, coord: Coord {x: 3, y: 0}}), // build(:unit_data, %{team: 6, coord: Coord {x: 4, y: 0}}), // build(:unit_data, %{team: 2, coord: Coord {x: 0, y: 2}}) // ], // tile_data: [ // build(:tile_data, %{tile_id: 34, team: 1, coord: Coord {x: 0, y: 0}, tile: city}), // build(:tile_data, %{tile_id: 34, team: 2, coord: Coord {x: 1, y: 0}, tile: city}), // build(:tile_data, %{tile_id: 34, team: 3, coord: Coord {x: 2, y: 0}, tile: city}), // build(:tile_data, %{tile_id: 34, team: 4, coord: Coord {x: 3, y: 0}, tile: city}), // build(:tile_data, %{tile_id: 34, team: 5, coord: Coord {x: 4, y: 0}, tile: city}), // build(:tile_data, %{tile_id: 35, team: 1, coord: Coord {x: 0, y: 1}, tile: base}), // build(:tile_data, %{tile_id: 35, team: 2, coord: Coord {x: 1, y: 1}, tile: base}), // build(:tile_data, %{tile_id: 35, team: 3, coord: Coord {x: 2, y: 1}, tile: base}), // build(:tile_data, %{tile_id: 35, team: 4, coord: Coord {x: 3, y: 1}, tile: base}), // build(:tile_data, %{tile_id: 35, team: 5, coord: Coord {x: 4, y: 1}, tile: base}) // ] // }) // |> Game.foggify(1) // assert Game { // unit_data: [ // UnitData {team: 2, coord: Coord {x: 0, y: 0}} // ], // tile_data: [ // TileData {tile_id: 34, team: 1, coord: Coord {x: 0, y: 0}}, // TileData {tile_id: 35, team: 1, coord: Coord {x: 0, y: 1}} // ] // } = game // } // test "obscures opposing units" { // unit_one = build(:unit, %{vision: 1}) // unit_two = build(:unit, %{vision: 2}) // game = build(:game, %{ // map_settings: build(:map_settings, %{ // use_fog: true // }), // map_data: "1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1", // map_type: "cardinal", // unit_data: [ // build(:unit_data, %{team: 1, coord: Coord {x: 2, y: 2}, unit: unit_two}), // build(:unit_data, %{team: 1, coord: Coord {x: 2, y: 3}, unit: unit_one}), // build(:unit_data, %{team: 2, coord: Coord {x: 0, y: 2}}), // build(:unit_data, %{team: 2, coord: Coord {x: 4, y: 2}}), // build(:unit_data, %{team: 2, coord: Coord {x: 2, y: 0}}), // build(:unit_data, %{team: 2, coord: Coord {x: 2, y: 4}}), // build(:unit_data, %{team: 2, coord: Coord {x: 3, y: 0}}), // build(:unit_data, %{team: 2, coord: Coord {x: 0, y: 0}}), // build(:unit_data, %{team: 2, coord: Coord {x: 4, y: 4}}) // ] // }) // |> Game.foggify(1) // assert Game { // unit_data: [ // UnitData {team: 1, coord: Coord {x: 2, y: 2}}, // UnitData {team: 1, coord: Coord {x: 2, y: 3}}, // UnitData {team: 2, coord: Coord {x: 0, y: 2}}, // UnitData {team: 2, coord: Coord {x: 4, y: 2}}, // UnitData {team: 2, coord: Coord {x: 2, y: 0}}, // UnitData {team: 2, coord: Coord {x: 2, y: 4}} // ] // } = game // } // test "obscures opposing units, with vision_bonus power" { // unit_one = build(:unit, %{vision: 1}) // unit_two = build(:unit, %{vision: 2}) // game = build(:game, %{ // map_settings: build(:map_settings, %{ // use_fog: true // }), // map_data: "1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1", // map_type: "cardinal", // user_data: [ // build(:user_data, %{ // team: 1, // power_data: [ // PowerData {power_id: Power.VisionBonus.id(), params: ["1"]} // ] // }) // ], // unit_data: [ // build(:unit_data, %{team: 1, coord: Coord {x: 2, y: 2}, unit: unit_two}), // build(:unit_data, %{team: 1, coord: Coord {x: 2, y: 3}, unit: unit_one}), // build(:unit_data, %{team: 2, coord: Coord {x: 0, y: 2}}), // build(:unit_data, %{team: 2, coord: Coord {x: 4, y: 2}}), // build(:unit_data, %{team: 2, coord: Coord {x: 2, y: 0}}), // build(:unit_data, %{team: 2, coord: Coord {x: 2, y: 4}}), // build(:unit_data, %{team: 2, coord: Coord {x: 3, y: 0}}), // build(:unit_data, %{team: 2, coord: Coord {x: 0, y: 0}}), // build(:unit_data, %{team: 2, coord: Coord {x: 4, y: 4}}) // ] // }) // |> Game.foggify(1) // assert Game { // unit_data: [ // UnitData {team: 1, coord: Coord {x: 2, y: 2}}, // UnitData {team: 1, coord: Coord {x: 2, y: 3}}, // UnitData {team: 2, coord: Coord {x: 0, y: 2}}, // UnitData {team: 2, coord: Coord {x: 4, y: 2}}, // UnitData {team: 2, coord: Coord {x: 2, y: 0}}, // UnitData {team: 2, coord: Coord {x: 2, y: 4}}, // UnitData {team: 2, coord: Coord {x: 3, y: 0}} #extra unit here // ] // } = game // } // test "obscures non-adjacent stealthed units" { // unit = build(:unit, %{vision: 4}) // stealth = build(:ability_data, %{ // ability_id: Ability.Stealth.id, active: true // }) // game = build(:game, %{ // map_settings: build(:map_settings, %{ // use_fog: true // }), // map_data: "1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1", // map_type: "cardinal", // unit_data: [ // build(:unit_data, %{team: 1, coord: Coord {x: 0, y: 0}, unit: unit}), // build(:unit_data, %{team: 1, coord: Coord {x: 0, y: 2}, unit: unit, ability_data: [stealth]}), // build(:unit_data, %{team: 2, coord: Coord {x: 1, y: 0}, ability_data: [stealth]}), // build(:unit_data, %{team: 2, coord: Coord {x: 2, y: 0}, ability_data: [stealth]}) // ] // }) // |> Game.foggify(1) // assert Game { // unit_data: [ // UnitData {team: 1, coord: Coord {x: 0, y: 0}}, // UnitData {team: 1, coord: Coord {x: 0, y: 2}}, // UnitData {team: 2, coord: Coord {x: 1, y: 0}} // ] // } = game // } // test "obscures non-adjacent forest units" { // unit = build(:unit, %{vision: 4}) // forest_one = build(:tile_data, %{ // tile_id: Tile.Forest.id(), coord: Coord {x: 1, y: 0} // }) // forest_two = build(:tile_data, %{ // tile_id: Tile.Forest.id(), coord: Coord {x: 2, y: 0} // }) // forest_three = build(:tile_data, %{ // tile_id: Tile.Forest.id(), coord: Coord {x: 0, y: 2} // }) // game = build(:game, %{ // map_settings: build(:map_settings, %{ // use_fog: true // }), // map_data: "1,3,3,1,1\n1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1", // map_type: "cardinal", // unit_data: [ // build(:unit_data, %{team: 1, coord: Coord {x: 0, y: 0}, unit: unit}), // build(:unit_data, %{team: 1, coord: Coord {x: 0, y: 2}, unit: unit}), // build(:unit_data, %{team: 2, coord: Coord {x: 1, y: 0}}), // build(:unit_data, %{team: 2, coord: Coord {x: 2, y: 0}}) // ], // tile_data: [forest_one, forest_two, forest_three] // }) // |> Game.foggify(1) // assert Game { // unit_data: [ // UnitData {team: 1, coord: Coord {x: 0, y: 0}}, // UnitData {team: 1, coord: Coord {x: 0, y: 2}}, // UnitData {team: 2, coord: Coord {x: 1, y: 0}} // ] // } = game // } // } // describe "get_adjacent_unit_data/2" { // test "shows adjacent units for a cardinal map" { // game = build(:game, %{ // map_data: "1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1", // map_type: "cardinal", // unit_data: [ // build(:unit_data, %{coord: Coord {x: 2, y: 1}}), // build(:unit_data, %{coord: Coord {x: 3, y: 1}}), // build(:unit_data, %{coord: Coord {x: 3, y: 2}}), // build(:unit_data, %{coord: Coord {x: 3, y: 3}}), // build(:unit_data, %{coord: Coord {x: 2, y: 3}}), // build(:unit_data, %{coord: Coord {x: 1, y: 3}}), // build(:unit_data, %{coord: Coord {x: 1, y: 2}}), // build(:unit_data, %{coord: Coord {x: 1, y: 1}}), // build(:unit_data, %{coord: Coord {x: 2, y: 0}}) // ] // }) // assert [ // UnitData {coord: Coord {x: 2, y: 1}}, // UnitData {coord: Coord {x: 1, y: 2}}, // UnitData {coord: Coord {x: 3, y: 2}}, // UnitData {coord: Coord {x: 2, y: 3}} // ] = Game.get_adjacent_unit_data(game, %{x: 2, y: 2}) // } // test "shows adjacent units for a hex map" { // game = build(:game, %{ // map_data: "1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1\n1,1,1,1,1", // map_type: "hex", // unit_data: [ // build(:unit_data, %{coord: Coord {x: 2, y: 1}}), // build(:unit_data, %{coord: Coord {x: 3, y: 1}}), // build(:unit_data, %{coord: Coord {x: 3, y: 2}}), // build(:unit_data, %{coord: Coord {x: 3, y: 3}}), // build(:unit_data, %{coord: Coord {x: 2, y: 3}}), // build(:unit_data, %{coord: Coord {x: 1, y: 3}}), // build(:unit_data, %{coord: Coord {x: 1, y: 2}}), // build(:unit_data, %{coord: Coord {x: 1, y: 1}}), // build(:unit_data, %{coord: Coord {x: 2, y: 0}}) // ] // }) // assert [ // UnitData {coord: Coord {x: 2, y: 1}}, // UnitData {coord: Coord {x: 3, y: 1}}, // UnitData {coord: Coord {x: 1, y: 2}}, // UnitData {coord: Coord {x: 3, y: 2}}, // UnitData {coord: Coord {x: 1, y: 3}}, // UnitData {coord: Coord {x: 2, y: 3}} // ] = Game.get_adjacent_unit_data(game, %{x: 2, y: 2}) // } // } // describe "defeat_by_capture/2" { // test "transfers properties and deletes units when primary hq is captured" { // user_one = UserData {user_id: UUID.generate(), faction: 1, team: 2} // user_two = UserData {user_id: UUID.generate(), faction: 2, team: 1} // game = Game { // user_data: [user_one, user_two], // tile_data: [ // TileData { // tile: Tile.HQ.create(), // faction: 1, // team: 1, // user_id: user_two.user_id // }, // TileData { // tile: Tile.City.create(), // team: 1, // user_id: user_one.user_id // } // ], // unit_data: [ // UnitData {user_id: user_one.user_id, team: 2}, // UnitData {user_id: user_two.user_id, team: 1} // ] // } // assert Game { // tile_data: [ // TileData {user_id: tile_one_user_id, team: 1, faction: 1}, // TileData {user_id: tile_two_user_id, team: 1} // ], // unit_data: [ // UnitData {user_id: unit_user_id, team: 1} // ] // } = Game.defeat_by_capture(game, user_one.user_id, 0) // assert tile_one_user_id == user_two.user_id // assert tile_two_user_id == user_two.user_id // assert unit_user_id == user_two.user_id // } // test "neutralizes properties and deletes units when secondary hqs are captured" { // user_one = UserData {user_id: UUID.generate(), faction: 1, team: 2} // user_two = UserData {user_id: UUID.generate(), faction: 2, team: 1} // game = Game { // user_data: [user_one, user_two], // tile_data: [ // TileData { // tile: Tile.Lab.create(), // faction: 1, // team: 1, // user_id: user_two.user_id // }, // TileData { // tile: Tile.Lab.create(), // faction: 1, // team: 1, // user_id: user_two.user_id // }, // TileData { // tile: Tile.City.create(), // team: 1, // user_id: user_one.user_id // } // ], // unit_data: [ // UnitData {user_id: user_one.user_id, team: 2}, // UnitData {user_id: user_two.user_id, team: 1} // ] // } // assert Game { // tile_data: [ // TileData {user_id: tile_one_user_id, team: 1, faction: 1}, // TileData {user_id: tile_two_user_id, team: 1, faction: 1}, // TileData {user_id: nil, team: nil} // ], // unit_data: [ // UnitData {user_id: unit_user_id, team: 1} // ] // } = Game.defeat_by_capture(game, user_one.user_id, 0) // assert tile_one_user_id == user_two.user_id // assert tile_two_user_id == user_two.user_id // assert unit_user_id == user_two.user_id // } // } // describe "defeat_by_unit/2" { // test "neutralizes properties when all units lost" { // user_one = UserData {user_id: UUID.generate(), faction: 1, team: 2} // user_two = UserData {user_id: UUID.generate(), faction: 2, team: 1} // game = Game { // user_data: [user_one, user_two], // tile_data: [ // TileData { // tile: Tile.HQ.create(), // team: 2, // faction: 1, // user_id: user_one.user_id // }, // TileData { // tile: Tile.City.create(), // team: 2, // faction: 1, // user_id: user_one.user_id // } // ], // unit_data: [ // UnitData {user_id: user_two.user_id, team: 1} // ] // } // assert Game { // tile_data: [ // TileData {user_id: nil, team: nil, faction: 1}, // TileData {user_id: nil, team: nil, faction: 1} // ], // unit_data: [ // UnitData {user_id: unit_user_id, team: 1} // ] // } = Game.defeat_by_unit(game, user_one.user_id, 0) // assert unit_user_id == user_two.user_id // } // } // describe "user_defeated?/2" { // test ":unit_data when no units" { // user_data = UserData {user_id: UUID.generate(), faction: 1} // game = Game {} // assert :unit_data == Game.user_defeated?(game, user_data) // } // test ":primary_hq when primary hq captured" { // user_data = UserData {user_id: UUID.generate(), faction: 1} // game = Game { // tile_data: [ // TileData { // tile: Tile.HQ.create(), // faction: 1, // user_id: nil // } // ], // unit_data: [ // UnitData {user_id: user_data.user_id} // ] // } // assert { // :primary_hq, // TileData {user_id: nil, faction: 1} // } = Game.user_defeated?(game, user_data) // } // test "false when no primary hqs" { // user_data = UserData {user_id: UUID.generate(), faction: 1} // game = Game { // tile_data: [], // unit_data: [ // UnitData {user_id: user_data.user_id} // ] // } // assert false == Game.user_defeated?(game, user_data) // } // test "false when primary hq not captured" { // user_data = UserData {user_id: UUID.generate(), faction: 1} // game = Game { // tile_data: [ // TileData {tile: Tile.HQ.create(), user_id: user_data.user_id} // ], // unit_data: [ // UnitData {user_id: user_data.user_id} // ] // } // assert false == Game.user_defeated?(game, user_data) // } // test ":secondary_hq when all secondary hqs captured" { // user_data = UserData {user_id: UUID.generate(), faction: 1} // game = Game { // tile_data: [ // TileData { // tile: Tile.Lab.create(), // faction: 1, // user_id: nil // }, // TileData { // tile: Tile.Lab.create(), // faction: 1, // user_id: nil // } // ], // unit_data: [ // UnitData {user_id: user_data.user_id} // ] // } // assert :secondary_hq == Game.user_defeated?(game, user_data) // } // test "false when not all secondary hqs captured" { // user_data = UserData {user_id: UUID.generate(), faction: 1} // game = Game { // tile_data: [ // TileData { // tile: Tile.Lab.create(), // faction: 1, // user_id: user_data.user_id // }, // TileData { // tile: Tile.Lab.create(), // faction: 1, // user_id: nil // } // ], // unit_data: [ // UnitData {user_id: user_data.user_id} // ] // } // assert false == Game.user_defeated?(game, user_data) // } // } // describe "end_active_powers/2" { // test "ends active powers" { // game = Game { // user_data: [ // UserData { // user_id: UUID.generate(), // }, // UserData { // id: UUID.generate(), // user_id: UUID.generate(), // power_active: "power", // power_turn: 1, // power_data: [ // PowerData {power_id: "attack_bonus"} // ], // commander: Commander { // passive: [ // PowerData {power_id: "defense_bonus"} // ] // } // }, // UserData { // id: UUID.generate(), // user_id: UUID.generate(), // power_active: "power", // power_turn: 2, // power_data: [ // PowerData {power_id: "attack_bonus"} // ], // commander: Commander { // passive: [ // PowerData {power_id: "cost_bonus"} // ] // } // }, // UserData { // id: UUID.generate(), // user_id: UUID.generate(), // power_active: "ultra", // power_turn: 3, // power_data: [ // PowerData {power_id: "attack_bonus"} // ], // commander: Commander { // passive: [ // PowerData {power_id: "capture_bonus"} // ] // } // } // ] // } // action = Action { // turn: 2 // } // assert Game { // user_data: [ // UserData { // power_active: nil, // power_turn: nil, // power_data: [ // PowerData {power_id: "cost_bonus"} // ] // }, // UserData { // power_active: nil, // power_turn: nil, // power_data: [ // PowerData {power_id: "defense_bonus"} // ] // }, // UserData { // power_active: nil, // power_turn: nil, // power_data: [] // }, // UserData { // power_active: "ultra", // power_turn: 3, // power_data: [ // PowerData {power_id: "attack_bonus"} // ] // } // ] // } = Game.end_active_powers(game, action) // } // } // describe "tile_funding/2" { // test "funds based on owned tiles" { // id = UUID.generate() // user_data = UserData { // funds: 123, // user_id: id // } // game = Game { // map_settings: %{ // funds_per_turn: 100 // }, // tile_data: [ // TileData {tile: Tile.HQ.create(), user_id: id}, // TileData {tile: Tile.City.create(), user_id: id}, // TileData {tile: Tile.Base.create(), user_id: id}, // TileData {tile: Tile.Airport.create(), user_id: id}, // TileData {tile: Tile.Port.create(), user_id: id}, // TileData {tile: Tile.Beacon.create(), user_id: id}, // TileData {tile: Tile.Lab.create(), user_id: id}, // TileData {tile: Tile.City.create()} // ] // } // assert UserData { // funds: 623 // } = Game.tile_funding(user_data, game) // } // test "funds based on owned tiles, with fund_income_bonus power" { // id = UUID.generate() // user_data = UserData { // funds: 123, // user_id: id, // power_data: [ // PowerData {power_id: Power.FundIncomeBonus.id(), params: ["100"]} // ] // } // game = Game { // map_settings: %{ // funds_per_turn: 1_000 // }, // tile_data: [ // TileData {tile: Tile.HQ.create(), user_id: id} // ] // } // assert UserData { // funds: 1_223 // } = Game.tile_funding(user_data, game) // } // } // describe "tile_repair/2" { // test "repairs & resupplies owned units" { // id = UUID.generate() // mech = AWDS.mech() // user_data = UserData { // user_id: id, // funds: 1_000 // } // game = Game { // tile_data: [ // TileData {coord: Coord {x: 0, y: 0}, tile_id: Tile.City.id(), user_id: id}, // TileData {coord: Coord {x: 0, y: 1}, tile_id: Tile.City.id(), user_id: id}, // TileData {coord: Coord {x: 0, y: 2}, tile_id: Tile.City.id()} // ], // unit_data: [ // UnitData { // coord: Coord {x: 0, y: 0}, // unit: mech, // fuel: 0, // cost: 1000, // health: 1, // user_id: id, // weapon_data: [] // }, // UnitData { // coord: Coord {x: 0, y: 1}, // unit: mech, // fuel: 0, // cost: 1000, // health: 2, // weapon_data: [] // }, // UnitData { // coord: Coord {x: 0, y: 2}, // unit: mech, // fuel: 0, // cost: 1000, // health: 3, // user_id: id, // weapon_data: [] // } // ], // user_data: [user_data] // } // assert Game { // unit_data: [ // UnitData {health: 21, fuel: 70, weapon_data: [_, _]}, // UnitData {health: 2, fuel: 0, weapon_data: []}, // UnitData {health: 3, fuel: 0, weapon_data: []} // ], // user_data: [ // UserData {user_id: id, funds: 1_000} // ] // } = Game.tile_repair(game, user_data) // } // test "repairs & resupplies, with repair_bonus power" { // id = UUID.generate() // mech = AWDS.mech() // user_data = UserData { // user_id: id, // funds: 1_000, // power_data: [ // PowerData {power_id: Power.RepairBonus.id(), params: ["10"]} // ] // } // game = Game { // tile_data: [ // TileData {coord: Coord {x: 0, y: 0}, tile_id: Tile.City.id(), user_id: id}, // ], // unit_data: [ // UnitData { // coord: Coord {x: 0, y: 0}, // unit: mech, // cost: 1000, // health: 1, // user_id: id // } // ], // user_data: [user_data] // } // assert Game { // unit_data: [ // UnitData {health: 31}, // ], // user_data: [ // UserData {user_id: id, funds: 1_000} // ] // } = Game.tile_repair(game, user_data) // } // test "selectively repairs based on unit_type" { // id = UUID.generate() // mech = AWDS.mech() // fighter = AWDS.fighter() // cruiser = AWDS.cruiser() // user_data = UserData { // user_id: id, // funds: 1_000 // } // game = Game { // tile_data: [ // TileData {coord: Coord {x: 0, y: 0}, tile_id: Tile.HQ.id(), user_id: id}, // TileData {coord: Coord {x: 0, y: 1}, tile_id: Tile.City.id(), user_id: id}, // TileData {coord: Coord {x: 0, y: 2}, tile_id: Tile.Base.id(), user_id: id}, // TileData {coord: Coord {x: 0, y: 3}, tile_id: Tile.Port.id(), user_id: id}, // TileData {coord: Coord {x: 0, y: 4}, tile_id: Tile.Airport.id(), user_id: id}, // TileData {coord: Coord {x: 0, y: 5}, tile_id: Tile.Omnifactory.id(), user_id: id}, // TileData {coord: Coord {x: 1, y: 0}, tile_id: Tile.HQ.id(), user_id: id}, // TileData {coord: Coord {x: 1, y: 1}, tile_id: Tile.City.id(), user_id: id}, // TileData {coord: Coord {x: 1, y: 2}, tile_id: Tile.Base.id(), user_id: id}, // TileData {coord: Coord {x: 1, y: 3}, tile_id: Tile.Port.id(), user_id: id}, // TileData {coord: Coord {x: 1, y: 4}, tile_id: Tile.Airport.id(), user_id: id}, // TileData {coord: Coord {x: 1, y: 5}, tile_id: Tile.Omnifactory.id(), user_id: id}, // TileData {coord: Coord {x: 2, y: 0}, tile_id: Tile.HQ.id(), user_id: id}, // TileData {coord: Coord {x: 2, y: 1}, tile_id: Tile.City.id(), user_id: id}, // TileData {coord: Coord {x: 2, y: 2}, tile_id: Tile.Base.id(), user_id: id}, // TileData {coord: Coord {x: 2, y: 3}, tile_id: Tile.Port.id(), user_id: id}, // TileData {coord: Coord {x: 2, y: 4}, tile_id: Tile.Airport.id(), user_id: id}, // TileData {coord: Coord {x: 2, y: 5}, tile_id: Tile.Omnifactory.id(), user_id: id} // ], // unit_data: [ // UnitData {coord: Coord {x: 0, y: 0}, unit: mech, health: 1, user_id: id}, // UnitData {coord: Coord {x: 0, y: 1}, unit: mech, health: 1, user_id: id}, // UnitData {coord: Coord {x: 0, y: 2}, unit: mech, health: 1, user_id: id}, // UnitData {coord: Coord {x: 0, y: 3}, unit: mech, health: 1, user_id: id}, // UnitData {coord: Coord {x: 0, y: 4}, unit: mech, health: 1, user_id: id}, // UnitData {coord: Coord {x: 0, y: 5}, unit: mech, health: 1, user_id: id}, // UnitData {coord: Coord {x: 1, y: 0}, unit: fighter, health: 1, user_id: id}, // UnitData {coord: Coord {x: 1, y: 1}, unit: fighter, health: 1, user_id: id}, // UnitData {coord: Coord {x: 1, y: 2}, unit: fighter, health: 1, user_id: id}, // UnitData {coord: Coord {x: 1, y: 3}, unit: fighter, health: 1, user_id: id}, // UnitData {coord: Coord {x: 1, y: 4}, unit: fighter, health: 1, user_id: id}, // UnitData {coord: Coord {x: 1, y: 5}, unit: fighter, health: 1, user_id: id}, // UnitData {coord: Coord {x: 2, y: 0}, unit: cruiser, health: 1, user_id: id}, // UnitData {coord: Coord {x: 2, y: 1}, unit: cruiser, health: 1, user_id: id}, // UnitData {coord: Coord {x: 2, y: 2}, unit: cruiser, health: 1, user_id: id}, // UnitData {coord: Coord {x: 2, y: 3}, unit: cruiser, health: 1, user_id: id}, // UnitData {coord: Coord {x: 2, y: 4}, unit: cruiser, health: 1, user_id: id}, // UnitData {coord: Coord {x: 2, y: 5}, unit: cruiser, health: 1, user_id: id} // ], // user_data: [user_data] // } // assert Game { // unit_data: [ // UnitData {health: 21}, // UnitData {health: 21}, // UnitData {health: 21}, // UnitData {health: 1}, // UnitData {health: 1}, // UnitData {health: 21}, // UnitData {health: 1}, // UnitData {health: 1}, // UnitData {health: 1}, // UnitData {health: 1}, // UnitData {health: 21}, // UnitData {health: 21}, // UnitData {health: 1}, // UnitData {health: 1}, // UnitData {health: 1}, // UnitData {health: 21}, // UnitData {health: 1}, // UnitData {health: 21}, // ], // user_data: [ // UserData {user_id: id, funds: 1_000} // ] // } = Game.tile_repair(game, user_data) // } // } // describe "use_fuel/2" { // test "reduces owned units by their fuel_usage" { // id = UUID.generate() // mech = AWDS.mech() // fighter = AWDS.fighter() // user_data = UserData { // user_id: id // } // game = Game { // unit_data: [ // UnitData {unit: mech, fuel: 1, user_id: id}, // UnitData {unit: fighter, fuel: 4, user_id: id}, // UnitData {unit: fighter, fuel: 6, user_id: id}, // UnitData {unit: fighter, fuel: 6} // ] // } // assert Game { // unit_data: [ // UnitData {fuel: 1}, // UnitData {fuel: 0}, // UnitData {fuel: 1}, // UnitData {fuel: 6} // ] // } = Game.use_fuel(game, user_data) // } // test "reduces owned units by their fuel_usage, with fuel_usage_bonus power" { // id = UUID.generate() // mech = AWDS.mech() // fighter = AWDS.fighter() // user_data = UserData { // user_id: id, // power_data: [ // PowerData {power_id: Power.FuelUsageBonus.id(), params: ["-2"]} // ] // } // game = Game { // unit_data: [ // UnitData {unit: mech, fuel: 1, user_id: id}, // UnitData {unit: fighter, fuel: 4, user_id: id} // ] // } // assert Game { // unit_data: [ // UnitData {fuel: 1}, // UnitData {fuel: 1} // ] // } = Game.use_fuel(game, user_data) // } // test "reduces owned units by their fuel_usage, with extreme fuel_usage_bonus power" { // id = UUID.generate() // fighter = AWDS.fighter() // user_data = UserData { // user_id: id, // power_data: [ // PowerData {power_id: Power.FuelUsageBonus.id(), params: ["-10"]} // ] // } // game = Game { // unit_data: [ // UnitData {unit: fighter, fuel: 1, user_id: id} // ] // } // assert Game { // unit_data: [ // UnitData {fuel: 1} // ] // } = Game.use_fuel(game, user_data) // } // test "reduces owned units by their fuel_usage, with positive fuel_usage_bonus power" { // id = UUID.generate() // fighter = AWDS.fighter() // user_data = UserData { // user_id: id, // power_data: [ // PowerData {power_id: Power.FuelUsageBonus.id(), params: ["2"]} // ] // } // game = Game { // unit_data: [ // UnitData {unit: fighter, fuel: 10, user_id: id} // ] // } // assert Game { // unit_data: [ // UnitData {fuel: 3} // ] // } = Game.use_fuel(game, user_data) // } // } // describe "destroy_no_fuel/2" { // test "removes owned units without fuel" { // id = UUID.generate() // mech = AWDS.mech() // fighter = AWDS.fighter() // cruiser = AWDS.cruiser() // user_data = UserData { // user_id: id // } // game = Game { // unit_data: [ // UnitData {team: 1, unit: mech, fuel: 1, user_id: id}, // UnitData {team: 2, unit: mech, fuel: 0, user_id: id}, // UnitData {team: 3, unit: mech, fuel: -1, user_id: id}, // UnitData {team: 4, unit: fighter, fuel: 1, user_id: id}, // UnitData {team: 5, unit: fighter, fuel: 0, user_id: id}, // UnitData {team: 6, unit: fighter, fuel: -1, user_id: id}, // UnitData {team: 7, unit: cruiser, fuel: 1, user_id: id}, // UnitData {team: 8, unit: cruiser, fuel: 0, user_id: id}, // UnitData {team: 9, unit: cruiser, fuel: -1, user_id: id}, // UnitData {team: 10, unit: cruiser, fuel: -1}, // ] // } // assert Game { // unit_data: [ // UnitData {team: 1, fuel: 1}, // UnitData {team: 2, fuel: 0}, // UnitData {team: 3, fuel: -1}, // UnitData {team: 4, fuel: 1}, // UnitData {team: 7, fuel: 1}, // UnitData {team: 10, fuel: -1} // ] // } = Game.destroy_no_fuel(game, user_data) // } // } // }