// defmodule WebWars.Engine.Ability.CaptureTest { // @moduledoc false // use WebWars.DataCase // alias Ecto.UUID // alias WebWars.Engine.{ // Action, // Ability, // Game, // MapSettings, // Power, // PowerData, // Tile, // TileData, // Unit, // UnitData, // UserData, // } // describe "apply/2" { // test "reduces tile capture strength" { // tile_data = TileData { // id: UUID.generate(), // tile_id: Tile.City.id(), // tile: Tile.City.create(), // capture_health: 20, // team: 1, // user_id: "00000000-0000-0000-0000-000000000000" // } // action = Action { // kind: "ability", // ability_id: AbilityKind::Capture, // subject: UnitData { // health: 100, // team: 2, // unit: Unit {}, // user_id: "00000000-0000-0000-0000-000000000001" // }, // subject_user_data: UserData {power_data: []}, // target: tile_data, // game: Game { // map_settings: MapSettings { // capture_strength: 20 // }, // tile_data: [tile_data], // user_data: [ // UserData { // user_id: "00000000-0000-0000-0000-000000000000" // } // ] // } // } // {game, _} = Ability.Capture.create().apply.(action) // assert Game { // tile_data: [ // TileData { // capture_health: 10, // team: 1, // user_id: "00000000-0000-0000-0000-000000000000" // } // ] // } = game // } // test "reduces tile capture strength with minimum health" { // tile_data = TileData { // id: UUID.generate(), // tile_id: Tile.City.id(), // tile: Tile.City.create(), // capture_health: 20, // team: 1, // user_id: "00000000-0000-0000-0000-000000000000" // } // action = Action { // kind: "ability", // ability_id: AbilityKind::Capture, // subject: UnitData { // health: 1, // team: 2, // unit: Unit {}, // user_id: "00000000-0000-0000-0000-000000000001" // }, // subject_user_data: UserData {power_data: []}, // target: tile_data, // game: Game { // map_settings: MapSettings { // capture_strength: 20 // }, // tile_data: [tile_data], // user_data: [ // UserData { // user_id: "00000000-0000-0000-0000-000000000000" // } // ] // } // } // {game, _} = Ability.Capture.create().apply.(action) // assert Game { // tile_data: [ // TileData { // capture_health: 19, // team: 1, // user_id: "00000000-0000-0000-0000-000000000000" // } // ] // } = game // } // test "transfers ownership of tile" { // tile_data = TileData { // id: UUID.generate(), // tile_id: Tile.City.id(), // tile: Tile.City.create(), // capture_health: 10, // team: 1, // user_id: "00000000-0000-0000-0000-000000000000" // } // action = Action { // kind: "ability", // ability_id: AbilityKind::Capture, // subject: UnitData { // health: 100, // team: 2, // unit: Unit {}, // user_id: "00000000-0000-0000-0000-000000000001" // }, // subject_user_data: UserData {power_data: []}, // target: tile_data, // game: Game { // map_settings: MapSettings { // capture_strength: 20 // }, // tile_data: [tile_data], // user_data: [ // UserData { // user_id: "00000000-0000-0000-0000-000000000000" // } // ] // } // } // {game, _} = Ability.Capture.create().apply.(action) // assert Game { // tile_data: [ // TileData { // capture_health: 20, // team: 2, // user_id: "00000000-0000-0000-0000-000000000001" // } // ] // } = game // } // test "reduces tile capture strength with bonus, positive" { // tile_data = TileData { // id: UUID.generate(), // tile_id: Tile.City.id(), // tile: Tile.City.create(), // capture_health: 20, // team: 1, // user_id: "00000000-0000-0000-0000-000000000000" // } // action = Action { // kind: "ability", // ability_id: AbilityKind::Capture, // subject: UnitData { // health: 100, // team: 2, // unit: Unit {}, // user_id: "00000000-0000-0000-0000-000000000001" // }, // subject_user_data: UserData { // power_data: [ // PowerData { // power_id: Power.CaptureBonus.id(), // params: ["50"] // } // ] // }, // target: tile_data, // game: Game { // map_settings: MapSettings { // capture_strength: 20 // }, // tile_data: [tile_data], // user_data: [ // UserData { // user_id: "00000000-0000-0000-0000-000000000000" // } // ] // } // } // {game, _} = Ability.Capture.create().apply.(action) // assert Game { // tile_data: [ // TileData { // capture_health: 5, // team: 1, // user_id: "00000000-0000-0000-0000-000000000000" // } // ] // } = game // } // test "reduces tile capture strength with minimum health and bonus, positive" { // tile_data = TileData { // id: UUID.generate(), // tile_id: Tile.City.id(), // tile: Tile.City.create(), // capture_health: 20, // team: 1, // user_id: "00000000-0000-0000-0000-000000000000" // } // action = Action { // kind: "ability", // ability_id: AbilityKind::Capture, // subject: UnitData { // health: 1, // team: 2, // unit: Unit {}, // user_id: "00000000-0000-0000-0000-000000000001" // }, // subject_user_data: UserData { // power_data: [ // PowerData { // power_id: Power.CaptureBonus.id(), // params: ["100"] // } // ] // }, // target: tile_data, // game: Game { // map_settings: MapSettings { // capture_strength: 20 // }, // tile_data: [tile_data], // user_data: [ // UserData { // user_id: "00000000-0000-0000-0000-000000000000" // } // ] // } // } // {game, _} = Ability.Capture.create().apply.(action) // assert Game { // tile_data: [ // TileData { // capture_health: 18, // team: 1, // user_id: "00000000-0000-0000-0000-000000000000" // } // ] // } = game // } // test "instantly captures tile with bonus" { // tile_data = TileData { // id: UUID.generate(), // tile_id: Tile.City.id(), // tile: Tile.City.create(), // capture_health: 20, // team: 1, // user_id: "00000000-0000-0000-0000-000000000000" // } // action = Action { // kind: "ability", // ability_id: AbilityKind::Capture, // subject: UnitData { // health: 100, // team: 2, // unit: Unit {}, // user_id: "00000000-0000-0000-0000-000000000001" // }, // subject_user_data: UserData { // power_data: [ // PowerData { // power_id: Power.InstantCapture.id(), // } // ] // }, // target: tile_data, // game: Game { // map_settings: MapSettings { // capture_strength: 20 // }, // tile_data: [tile_data], // user_data: [ // UserData { // user_id: "00000000-0000-0000-0000-000000000000" // } // ] // } // } // {game, _} = Ability.Capture.create().apply.(action) // assert Game { // tile_data: [ // TileData { // capture_health: 20, // team: 2, // user_id: "00000000-0000-0000-0000-000000000001" // } // ] // } = game // } // } // } // test "create_action/1 kind: ability/capture" { // user = insert(:user) // commander = insert(:commander) // user_data = build(:user_data, %{ // turn: true, // user_id: user.id, // commander_id: commander.id // }) // unit_data = unit_data(AWDS.infantry(), %{ // coord: build(:coord, %{x: 0, y: 0}), // user_id: user_data.user_id, // health: 100, // faction: 1 // }) // tile_data = build(:tile_data, %{ // coord: build(:coord, %{x: 0, y: 0}), // tile_id: Tile.City.id(), // capture_health: 10, // user_id: nil, // }) // game = insert(:game, %{ // user_data: [user_data], // tile_data: [tile_data], // unit_data: [unit_data] // }) // tile_data = game.tile_data |> Enum.at(0) // unit_data = game.unit_data |> Enum.at(0) // insert(:game_user, %{game: game, faction: 1}) // insert(:game_user, %{game: game, faction: 2}) // action = build(:action, %{ // kind: "ability", // ability_id: AbilityKind::Capture, // subject_unit_data_id: unit_data.id, // target_tile_data_id: tile_data.id, // game_id: game.id, // user_id: user.id // }) // |> Map.from_struct() // assert {:ok, Action { // game: Game { // tile_data: [ // TileData {user_id: user_id, capture_health: 20, faction: nil} // ] // } // }} = Engine.create_action(action) // assert user_id == user_data.user_id // } // test "create_action/1 kind: ability/capture ends game user" { // user = insert(:user) // commander = insert(:commander) // user_data_one = build(:user_data, %{ // turn: true, // user_id: user.id, // commander_id: commander.id, // team: 1, // faction: 1 // }) // user_data_two = build(:user_data, %{ // turn: false, // user_id: insert(:user).id, // commander_id: commander.id, // team: 2, // faction: 2 // }) // unit_data = unit_data(AWDS.infantry(), %{ // coord: build(:coord, %{x: 0, y: 0}), // user_id: user_data_one.user_id, // health: 100, // faction: 1, // team: 1 // }) // tile_data = build(:tile_data, %{ // coord: build(:coord, %{x: 0, y: 0}), // tile_id: Tile.HQ.id(), // capture_health: 10, // user_id: user_data_two.user_id, // team: 2, // faction: 2 // }) // game = insert(:game, %{ // user_data: [user_data_one, user_data_two], // tile_data: [tile_data], // unit_data: [unit_data] // }) // tile_data = game.tile_data |> Enum.at(0) // unit_data = game.unit_data |> Enum.at(0) // insert(:game_user, %{game: game, faction: 1}) // insert(:game_user, %{game: game, faction: 2}) // action = build(:action, %{ // kind: "ability", // ability_id: AbilityKind::Capture, // subject_unit_data_id: unit_data.id, // target_tile_data_id: tile_data.id, // game_id: game.id, // user_id: user.id // }) // |> Map.from_struct() // assert {:ok, Action { // game: Game { // active: false, // tile_data: [ // TileData {user_id: user_id, capture_health: 20, faction: 2, team: 1} // ], // user_data: [ // UserData {team: 2, active: false, state: "defeat"}, // UserData {team: 1, active: true} // ] // } // } = action} = Engine.create_action(action) // assert user_id == user_data_one.user_id // assert_delivered_email WebWarsNotify.Mailers.GameEnd.email(action) // refute_delivered_email WebWarsNotify.Mailers.Defeat.email(action) // } // test "create_action/1 kind: ability/capture deactivates user" { // user = insert(:user) // user_two = insert(:user) // user_three = insert(:user) // commander = insert(:commander) // user_data_one = build(:user_data, %{ // turn: true, // user_id: user.id, // commander_id: commander.id, // team: 1, // faction: 1 // }) // user_data_two = build(:user_data, %{ // turn: false, // user_id: user_two.id, // commander_id: commander.id, // team: 2, // faction: 2 // }) // user_data_three = build(:user_data, %{ // team: 3, // faction: 3, // commander_id: commander.id, // user_id: user_three.id // }) // unit_data = unit_data(AWDS.infantry(), %{ // coord: build(:coord, %{x: 0, y: 0}), // user_id: user_data_one.user_id, // health: 100, // faction: 1, // team: 1 // }) // tile_data = build(:tile_data, %{ // coord: build(:coord, %{x: 0, y: 0}), // tile_id: Tile.HQ.id(), // capture_health: 10, // user_id: user_data_two.user_id, // team: 2, // faction: 2 // }) // game = insert(:game, %{ // user_data: [ // user_data_one, // user_data_two, // user_data_three // ], // tile_data: [tile_data], // unit_data: [unit_data] // }) // tile_data = game.tile_data |> Enum.at(0) // unit_data = game.unit_data |> Enum.at(0) // insert(:game_user, %{game: game, faction: 1}) // insert(:game_user, %{game: game, faction: 2}) // action = build(:action, %{ // kind: "ability", // ability_id: AbilityKind::Capture, // subject_unit_data_id: unit_data.id, // target_tile_data_id: tile_data.id, // game_id: game.id, // user_id: user.id // }) // |> Map.from_struct() // assert {:ok, Action { // game: Game { // active: true, // tile_data: [ // TileData {user_id: user_id, capture_health: 20, faction: 2, team: 1} // ], // user_data: [ // UserData {team: 2, active: false, state: "defeat"}, // UserData {team: 1, active: true, state: nil}, // UserData {team: 3, active: true, state: nil} // ] // } // }} = Engine.create_action(action) // assert user_id == user_data_one.user_id // [ // Action {kind: "ability"}, // Action {kind: "defeat"} = defeat_action // ] = Engine.list_actions() // defeat_action = Action {defeat_action | game: game, user: user_two} // assert_delivered_email WebWarsNotify.Mailers.Defeat.email(defeat_action) // }