diff --git a/apps/amethyst/.envrc b/.envrc similarity index 100% rename from apps/amethyst/.envrc rename to .envrc diff --git a/apps/amethyst/lib/api/game.ex b/apps/amethyst/lib/api/game.ex index cdfa36d..a9c5c03 100644 --- a/apps/amethyst/lib/api/game.ex +++ b/apps/amethyst/lib/api/game.ex @@ -36,21 +36,23 @@ defmodule Amethyst.API.Game do Amethyst.GameRegistry.register(__MODULE__, unquote(meta)) Process.sleep(:infinity) end - def start(state) do - loop(state) - end - defp loop(state) do - receive do - {:login, caller, cfg} -> - case login(caller, cfg, state) do - {:ok, state} -> - send(caller, :ok) - loop(state) - {:refuse, state} -> - send(caller, :refuse) - loop(state) - end - end + end + end + + @spec start(Amethyst.API.Game, term()) :: no_return() + def start(mod, state) do + loop(mod, state) + end + defp loop(mod, state) do + receive do + {:login, caller, cfg} -> + case mod.login(caller, cfg, state) do + {:ok, state} -> + send(caller, :ok) + loop(mod, state) + {:refuse, state} -> + send(caller, :refuse) + loop(mod, state) end end end diff --git a/apps/amethyst/lib/apps/game_coordinator.ex b/apps/amethyst/lib/apps/game_coordinator.ex index b1dceb3..bdc6158 100644 --- a/apps/amethyst/lib/apps/game_coordinator.ex +++ b/apps/amethyst/lib/apps/game_coordinator.ex @@ -54,7 +54,7 @@ defmodule Amethyst.GameCoordinator do defp _create(type, games) do state = type.instantiate() - pid = spawn(type, :start, [state]) + pid = spawn(Amethyst.API.Game, :start, [type, state]) games = [{type, pid, []} | games] {pid, games} end diff --git a/apps/amethyst/lib/apps/game_registry.ex b/apps/amethyst/lib/apps/game_registry.ex index 2b626ea..cd9a575 100644 --- a/apps/amethyst/lib/apps/game_registry.ex +++ b/apps/amethyst/lib/apps/game_registry.ex @@ -30,9 +30,10 @@ defmodule Amethyst.GameRegistry do @impl true def handle_call({:register, module, meta}, _, state) do if Keyword.get(meta, :default, false) && find_default(state) != nil do - {:reply, :error, :default_exists} + {:reply, {:error, :default_exists}, state} + else + {:reply, :ok, [{module, meta} | state]} end - {:reply, :ok, [{module, meta} | state]} end @impl true diff --git a/apps/amethyst/test/game_registry_test.exs b/apps/amethyst/test/game_registry_test.exs new file mode 100644 index 0000000..e54a89e --- /dev/null +++ b/apps/amethyst/test/game_registry_test.exs @@ -0,0 +1,33 @@ +defmodule GameRegistryTest do + use ExUnit.Case, async: true + + @moduledoc """ + This module includes tests for Amethyst.GameRegistry + """ + + test "Register a game" do + Amethyst.GameRegistry.register(:fake_game, [:some_meta]) + assert Amethyst.GameRegistry.list() |> Enum.member?({:fake_game, [:some_meta]}) + end + + test "Register many games" do + Range.new(0, 50) |> Enum.map(fn game -> + game = String.to_atom("game#{game}") + Amethyst.GameRegistry.register(game, []) + game + end) |> Enum.map(fn game -> + assert Amethyst.GameRegistry.list() |> Enum.member?({game, []}) + end) + end + + test "Register and get default game" do + Amethyst.GameRegistry.register(:fake_game, [default: true]) + assert Amethyst.GameRegistry.get_default() == {:fake_game, [default: true]} + end + + test "Fail to register multiple games" do + Amethyst.GameRegistry.register(:fake_game, [default: true]) + assert Amethyst.GameRegistry.register(:other_game, [default: true]) == {:error, :default_exists} + assert Amethyst.GameRegistry.get_default() == {:fake_game, [default: true]} + end +end diff --git a/apps/example_game/lib/example/game.ex b/apps/example_game/lib/example/game.ex index e8163a3..9093165 100644 --- a/apps/example_game/lib/example/game.ex +++ b/apps/example_game/lib/example/game.ex @@ -9,7 +9,7 @@ defmodule Example.Game do @impl true def login(from, cfg, state) do - Logger.debug("Player logged in from #{inspect(from)}: #{inspect(cfg)}") + Logger.info("Player logged in from #{inspect(from)}: #{inspect(cfg)}") {:ok, state} end end diff --git a/apps/example_game/test/test_helper.exs b/apps/example_game/test/test_helper.exs deleted file mode 100644 index 869559e..0000000 --- a/apps/example_game/test/test_helper.exs +++ /dev/null @@ -1 +0,0 @@ -ExUnit.start()