diff --git a/lib/stack.ex b/lib/stack.ex new file mode 100644 index 0000000..834770c --- /dev/null +++ b/lib/stack.ex @@ -0,0 +1,19 @@ +defmodule MyStack do + use GenServer + + def start_link(args) do + GenServer.start_link(__MODULE__, nil, name: args[:name]) + end + + def init(_) do + {:ok, []} + end + + def handle_info({:push, el}, state) do + {:noreply, [el] ++ state} + end + + def handle_call(:pop, _from, [head | tail]) do + {:reply, head, tail} + end +end diff --git a/test/test_helper.exs b/test/test_helper.exs new file mode 100644 index 0000000..869559e --- /dev/null +++ b/test/test_helper.exs @@ -0,0 +1 @@ +ExUnit.start() diff --git a/test/test_stack.exs b/test/test_stack.exs new file mode 100644 index 0000000..9b49deb --- /dev/null +++ b/test/test_stack.exs @@ -0,0 +1,40 @@ +defmodule MyStack.Test do + + require MyStack + + use ExUnit.Case, async: true + + defmodule MySupervisor do + use Supervisor + + def start_link do + Supervisor.start_link(__MODULE__, :ok) + end + + def init(:ok) do + children = [ + %{id: 1, start: {MyStack, :start_link, [[name: :my_server]]}}, + %{id: 2, start: {MyStack, :start_link, [[name: :my_server2]]}} + ] + + Supervisor.init(children, strategy: :one_for_one) + end + end + + setup do + {:ok, supervisor: MySupervisor.start_link()} + end + + test "server starts with an empty client list", %{supervisor: supervisor} do + send(:my_server, {:push, 2}) + assert GenServer.call(:my_server, :pop) == 2 + send(:my_server, {:push, 1}) + send(:my_server, {:push, 4}) + send(:my_server2, {:push, 3}) + send(:my_server2, {:push, 8}) + assert GenServer.call(:my_server2, :pop) == 8 + assert GenServer.call(:my_server, :pop) == 4 + assert GenServer.call(:my_server2, :pop) == 3 + assert GenServer.call(:my_server, :pop) == 1 + end +end