gen_reset.ex 977 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. defmodule GenReset do
  2. @moduledoc """
  3. Documentation for GenServerReset.
  4. GenServerReset allows GenServers to be reset during testing.
  5. """
  6. defmacro __using__(_args) do
  7. quote do
  8. def handle_call(:"$gen_reset", _from, state) do
  9. args = case :erlang.get(:"$gen_reset_initial_args") do
  10. :undefined -> nil
  11. rest -> rest
  12. end
  13. case init(args) do
  14. {:ok, state} ->
  15. {:reply, :ok, state}
  16. {:ok, state, continue} ->
  17. {:reply, :ok, state, continue}
  18. end
  19. end
  20. def register_gen_reset(args) do
  21. GenReset.Tracker.add(self())
  22. :erlang.put(:"$gen_reset_initial_args", args)
  23. end
  24. end
  25. end
  26. end
  27. defmodule Server do
  28. use GenServer
  29. use GenReset
  30. def init(args) do
  31. register_gen_reset(args)
  32. {:ok, args}
  33. end
  34. def handle_call(:state, _from, state), do: {:reply, state, state}
  35. def handle_cast({:set, value}, _state), do: {:noreply, value}
  36. end