// defmodule WebWars.WeaponTest { // @moduledoc false // use WebWars.DataCase // alias WebWars.Engine.{ // Coord, // DefenseType, // MovementType, // Unit, // Weapon // } // fn weapon_valid(weapon) { // assert is_bitstring(weapon.id) // assert is_bitstring(weapon.name) // assert is_number(weapon.min_range) // assert is_number(weapon.max_range) // targets_valid(weapon) // damages_valid(weapon) // } // fn targets_valid(%{targets: targets} = weapon) { // assert %{} = targets // for {key, value} <- targets { // assert key in Unit.types(), // "#{weapon.name} has invalid target key: #{key}" // assert value -- MovementType.types() |> length() == 0, // "#{weapon.name} has invalid target value: #{Enum.join(value, ", ")}" // } // } // fn damages_valid(%{damages: damages} = weapon) { // assert %{} = damages // value = DefenseType.types() -- Map.keys(damages) // assert value |> length() == 0, // "#{weapon.name} is missing damage values: #{Enum.join(value, ", ")}" // assert Enum.all?(Map.values(damages), &is_number/1), // "#{weapon.name} is has invalid damage values" // } // describe "weapons" { // test "all/0 returns all valid data" { // weapons = Weapon.all() // Enum.map(weapons, &(weapon_valid(&1))) // } // test "ids/0 has all unique ids" { // raw_ids = Weapon.all() |> Enum.map(&(&1.id)) // ids = Weapon.ids() // uniq_ids = Enum.uniq(ids) // assert length(ids) == length(raw_ids) // assert length(ids) == uniq_ids |> length(), // "ids/0 must be unique: #{Enum.join(ids -- uniq_ids, ", ")}" // } // } // describe "in_range?/5" { // test "reports if a target is in range" { // assert Weapon.in_range?( // Weapon.ArtilleryRockets.create(), // %Coord {x: 0, y: 0}, %Coord {x: 0, y: 3} // ) // assert Weapon.in_range?( // Weapon.ArtilleryRockets.create(), // %Coord {x: 0, y: 0}, %Coord {x: 0, y: 5} // ) // refute Weapon.in_range?( // Weapon.ArtilleryRockets.create(), // %Coord {x: 0, y: 0}, %Coord {x: 0, y: 2} // ) // refute Weapon.in_range?( // Weapon.ArtilleryRockets.create(), // %Coord {x: 0, y: 0}, %Coord {x: 0, y: 6} // ) // } // test "takes extra_min and extra_max into account" { // refute Weapon.in_range?( // Weapon.ArtilleryRockets.create(), // %Coord {x: 0, y: 0}, %Coord {x: 0, y: 3}, // 1, 0 // ) // refute Weapon.in_range?( // Weapon.ArtilleryRockets.create(), // %Coord {x: 0, y: 0}, %Coord {x: 0, y: 5}, // 0, -1 // ) // assert Weapon.in_range?( // Weapon.ArtilleryRockets.create(), // %Coord {x: 0, y: 0}, %Coord {x: 0, y: 2}, // -1, 0 // ) // assert Weapon.in_range?( // Weapon.ArtilleryRockets.create(), // %Coord {x: 0, y: 0}, %Coord {x: 0, y: 6}, // 0, 1 // ) // } // } // }