// defmodule WebWars.Engine.Action.PowerTest { // @moduledoc false // use WebWars.DataCase // import WebWars.Factory // alias Data.AWDS // alias Ecto.Changeset // alias WebWars.Engine.{ // Action, // Game, // UserData, // PowerData, // } // describe "validate/1" { // test "validates when use_powers: false" { // id = Ecto.UUID.generate() // action = Action { // kind: "power", // params: ["power"], // user_id: id, // game: Game { // user_data: [ // UserData {user_id: id, turn: true} // ], // map_settings: %{ // use_powers: false // } // } // } // changeset = Changeset.change(action) // assert Changeset { // errors: [ // kind: {"is invalid", []} // ] // } = Action.Power.validate(changeset, action) // } // test "validates when use_powers: true" { // id = Ecto.UUID.generate() // action = Action { // kind: "power", // params: ["power"], // user_id: id, // game: Game { // map_settings: %{ // use_powers: true // }, // user_data: [ // UserData { // user_id: id, // turn: true, // charge: 999_999, // commander: AWDS.andy() // } // ] // } // } // |> Action.Power.preload() // changeset = Changeset.change(action) // assert Changeset {valid?: true} = Action.Power.validate(changeset, action) // } // test "validates params specifies power" { // id = Ecto.UUID.generate() // action = Action { // kind: "power", // params: [], // user_id: id, // game: Game { // map_settings: %{ // use_powers: true // }, // user_data: [ // UserData {user_id: id, turn: true} // ] // } // } // changeset = Changeset.change(action) // assert Changeset { // errors: [ // params: {"must specify power", []} // ] // } = Action.Power.validate(changeset, action) // } // test "validates params specifies valid power" { // id = Ecto.UUID.generate() // action = Action { // kind: "power", // params: ["pants"], // user_id: id, // game: Game { // map_settings: %{ // use_powers: true // }, // user_data: [ // UserData {user_id: id, turn: true} // ] // } // } // changeset = Changeset.change(action) // assert Changeset { // errors: [ // params: {"must specify power", []} // ] // } = Action.Power.validate(changeset, action) // } // test "validates params: passive is reserved for system: true" { // id = Ecto.UUID.generate() // action = Action { // kind: "power", // params: ["passive"], // user_id: id, // system: false, // game: Game { // map_settings: %{ // use_powers: true // }, // user_data: [ // UserData {user_id: id, turn: true} // ] // } // } // changeset = Changeset.change(action) // assert Changeset { // errors: [ // kind: {"must be system action", []} // ] // } = Action.Power.validate(changeset, action) // } // } // describe "apply/2" { // test "applies passive powers" { // id = Ecto.UUID.generate() // game_id = Ecto.UUID.generate() // action = build(:action, %{ // kind: "power", // params: ["passive"], // user_id: id, // game_id: game_id, // system: true, // game: build(:game, %{ // id: game_id, // map_settings: %{ // use_powers: true // }, // user_data: [ // build(:user_data, %{ // user_id: id, // turn: true, // commander: AWDS.max(), // charge: 27_001, // power_count: 1, // power_data: [ // PowerData {params: ["999"], tags: ["some random data"]} // ] // }) // ] // }) // }) // |> Action.Power.preload() // {game, _} = Action.Power.apply(action) // assert Game { // user_data: [ // UserData { // charge: 27_001, // power_count: 1, // power_active: nil, // power_turn: nil, // power_data: [ // PowerData {power_id: "max_range_bonus", params: ["-1"], tags: ["indirect"]}, // PowerData {power_id: "attack_bonus", params: ["-10"], tags: ["indirect"]}, // PowerData {power_id: "attack_bonus", params: ["20"], tags: ["direct", "sea"]}, // PowerData {power_id: "attack_bonus", params: ["20"], tags: ["direct", "air"]}, // PowerData {power_id: "attack_bonus", params: ["20"], tags: ["direct", "vehicle"]} // ] // } // ] // } = game // } // test "applies power power" { // id = Ecto.UUID.generate() // game_id = Ecto.UUID.generate() // action = build(:action, %{ // kind: "power", // params: ["power"], // user_id: id, // game_id: game_id, // system: true, // game: build(:game, %{ // id: game_id, // map_settings: %{ // use_powers: true // }, // user_data: [ // build(:user_data, %{ // user_id: id, // turn: true, // commander: AWDS.max(), // charge: 54_001, // power_count: 0, // power_data: [ // PowerData {params: ["999"], tags: ["some random data"]} // ] // }) // ] // }) // }) // |> Action.Power.preload() // {game, _} = Action.Power.apply(action) // assert Game { // user_data: [ // UserData { // charge: 27_001, // power_count: 1, // power_active: "power", // power_turn: 1, // power_data: [ // PowerData {power_id: "movement_bonus", params: ["1"], tags: ["direct"]}, // PowerData {power_id: "defense_bonus", params: ["10"], tags: ["direct"]}, // PowerData {power_id: "attack_bonus", params: ["10"], tags: ["direct"]}, // PowerData {power_id: "max_range_bonus", params: ["-1"], tags: ["indirect"]}, // PowerData {power_id: "attack_bonus", params: ["-10"], tags: ["indirect"]}, // PowerData {power_id: "attack_bonus", params: ["20"], tags: ["direct", "sea"]}, // PowerData {power_id: "attack_bonus", params: ["20"], tags: ["direct", "air"]}, // PowerData {power_id: "attack_bonus", params: ["20"], tags: ["direct", "vehicle"]} // ] // } // ] // } = game // } // test "applies ultra power" { // id = Ecto.UUID.generate() // game_id = Ecto.UUID.generate() // action = build(:action, %{ // kind: "power", // params: ["ultra"], // user_id: id, // game_id: game_id, // system: true, // game: build(:game, %{ // id: game_id, // map_settings: %{ // use_powers: true // }, // user_data: [ // build(:user_data, %{ // user_id: id, // turn: true, // commander: AWDS.max(), // charge: 54_001, // power_data: [ // PowerData {params: ["999"], tags: ["some random data"]} // ] // }) // ] // }) // }) // |> Action.Power.preload() // {game, _} = Action.Power.apply(action) // assert Game { // user_data: [ // UserData { // charge: 1, // power_count: 1, // power_active: "ultra", // power_turn: 1, // power_data: [ // PowerData {power_id: "movement_bonus", params: ["2"], tags: ["direct"]}, // PowerData {power_id: "defense_bonus", params: ["10"], tags: ["direct"]}, // PowerData {power_id: "attack_bonus", params: ["30"], tags: ["direct"]}, // PowerData {power_id: "max_range_bonus", params: ["-1"], tags: ["indirect"]}, // PowerData {power_id: "attack_bonus", params: ["-10"], tags: ["indirect"]}, // PowerData {power_id: "attack_bonus", params: ["20"], tags: ["direct", "sea"]}, // PowerData {power_id: "attack_bonus", params: ["20"], tags: ["direct", "air"]}, // PowerData {power_id: "attack_bonus", params: ["20"], tags: ["direct", "vehicle"]} // ] // } // ] // } = game // } // test "scales cost by use" { // id = Ecto.UUID.generate() // game_id = Ecto.UUID.generate() // action = build(:action, %{ // kind: "power", // params: ["ultra"], // user_id: id, // game_id: game_id, // system: true, // game: build(:game, %{ // id: game_id, // map_settings: %{ // use_powers: true // }, // user_data: [ // build(:user_data, %{ // user_id: id, // turn: true, // commander: AWDS.max(), // charge: 162_001, // power_count: 10 // }) // ] // }) // }) // |> Action.Power.preload() // {game, _} = Action.Power.apply(action) // assert Game { // user_data: [ // UserData { // charge: 1, // power_count: 11, // power_active: "ultra", // power_turn: 1 // } // ] // } = game // } // test "increments power_turn" { // id = Ecto.UUID.generate() // game_id = Ecto.UUID.generate() // action = build(:action, %{ // kind: "power", // params: ["power"], // user_id: id, // game_id: game_id, // system: true, // turn: 2, // game: build(:game, %{ // id: game_id, // map_settings: %{ // use_powers: true // }, // user_data: [ // build(:user_data, %{ // user_id: id, // turn: true, // commander: AWDS.max(), // charge: 27_001 // }), // build(:user_data), // build(:user_data), // build(:user_data) // ] // }) // }) // |> Action.Power.preload() // {game, _} = Action.Power.apply(action) // assert Game { // user_data: [ // UserData { // power_turn: 5 // }, // UserData {}, // UserData {}, // UserData {} // ] // } = game // } // } // } // test "create_action/1 kind: power" { // user = insert(:user) // commander = insert(:commander, %{ // powerbar: 1, // ultrabar: 1 // }) // user_data = build(:user_data, %{ // turn: true, // user_id: user.id, // commander_id: commander.id, // charge: 9_001, // }) // game = insert(:game, %{ // user_data: [user_data], // map_settings: build(:map_settings, %{ // use_powers: true, // }) // }) // insert(:game_user, %{game: game, faction: 1}) // insert(:game_user, %{game: game, faction: 2}) // action = build(:action, %{ // kind: "power", // params: ["power"], // user_id: user.id, // game_id: game.id // }) // |> Map.from_struct() // assert {:ok, Action { // game: Game { // user_data: [ // UserData { // power_count: 1, // charge: 1, // }, // ] // } // }} = Engine.create_action(action) // } // test "create_action/1 kind: power with power_count=1" { // user = insert(:user) // commander = insert(:commander, %{ // powerbar: 1, // ultrabar: 1 // }) // user_data = build(:user_data, %{ // turn: true, // user_id: user.id, // commander_id: commander.id, // power_count: 1, // charge: 10_801, // }) // game = insert(:game, %{ // user_data: [user_data], // map_settings: build(:map_settings, %{ // use_powers: true, // }) // }) // insert(:game_user, %{game: game, faction: 1}) // insert(:game_user, %{game: game, faction: 2}) // action = build(:action, %{ // kind: "power", // params: ["power"], // user_id: user.id, // game_id: game.id // }) // |> Map.from_struct() // assert {:ok, Action { // game: Game { // user_data: [ // UserData { // power_count: 2, // charge: 1, // }, // ] // } // }} = Engine.create_action(action) // }