separate dummy hello and real actor tests; actor (and test) improvements
This commit is contained in:
parent
51e3426202
commit
08688355f5
5 changed files with 45 additions and 38 deletions
19
lib/actor.ex
19
lib/actor.ex
|
|
@ -1,12 +1,15 @@
|
||||||
defmodule Xplore.Actor do
|
defmodule Xplore.Actor do
|
||||||
|
|
||||||
def loop(bhv) do
|
defp loop(bhv) do
|
||||||
receive do
|
receive do msg ->
|
||||||
|
#IO.puts("receive: #{inspect msg}")
|
||||||
|
case msg do
|
||||||
{:message, msg} ->
|
{:message, msg} ->
|
||||||
bhv.(msg)
|
bhv.(msg)
|
||||||
loop(bhv)
|
loop(bhv)
|
||||||
{:system, :become, bhv_n} -> loop(bhv_n)
|
{:become, bhv_n} -> loop(bhv_n)
|
||||||
{:system, :quit} -> :quit
|
{:quit} -> nil
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -14,15 +17,15 @@ defmodule Xplore.Actor do
|
||||||
spawn_link(fn -> loop(bhv) end)
|
spawn_link(fn -> loop(bhv) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_message(ac, msg) do
|
def send(ac, msg) do
|
||||||
send(ac, {:message, msg})
|
Kernel.send(ac, {:message, msg})
|
||||||
end
|
end
|
||||||
|
|
||||||
def become(ac, bhv) do
|
def become(ac, bhv) do
|
||||||
send(ac, {:system, :become, bhv})
|
Kernel.send(ac, {:become, bhv})
|
||||||
end
|
end
|
||||||
|
|
||||||
def stop(ac) do
|
def stop(ac) do
|
||||||
send(ac, {:system, :quit})
|
Kernel.send(ac, {:quit})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
defmodule Xplore do
|
defmodule Hello do
|
||||||
@moduledoc """
|
@moduledoc """
|
||||||
Documentation for `Xplore`.
|
Documentation for `Hello`.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
|
|
@ -8,7 +8,7 @@ defmodule Xplore do
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> Xplore.hello()
|
iex> Hello.hello()
|
||||||
:world
|
:world
|
||||||
|
|
||||||
"""
|
"""
|
||||||
19
test/actor_test.exs
Normal file
19
test/actor_test.exs
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
defmodule ActorTest do
|
||||||
|
use ExUnit.Case, async: true
|
||||||
|
|
||||||
|
alias Xplore.Actor
|
||||||
|
|
||||||
|
describe "simple-actors:" do
|
||||||
|
test "basic-life-cycle" do
|
||||||
|
this = self()
|
||||||
|
ac = Actor.create(fn msg -> send(this, msg) end)
|
||||||
|
Actor.send(ac, "Hello Actor!")
|
||||||
|
Actor.become(ac, fn _msg -> send(this, "Goodbye") end)
|
||||||
|
Actor.send(ac, "Hello Actor!")
|
||||||
|
Actor.stop(ac)
|
||||||
|
assert_receive "Hello Actor!"
|
||||||
|
assert_receive "Goodbye"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
9
test/hello_test.exs
Normal file
9
test/hello_test.exs
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
defmodule HelloTest do
|
||||||
|
use ExUnit.Case
|
||||||
|
doctest Hello
|
||||||
|
|
||||||
|
test "greets the world" do
|
||||||
|
assert Hello.hello() == :world
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
defmodule XploreTest do
|
|
||||||
use ExUnit.Case
|
|
||||||
doctest Xplore
|
|
||||||
|
|
||||||
alias Xplore.Actor
|
|
||||||
|
|
||||||
test "greets the world" do
|
|
||||||
assert Xplore.hello() == :world
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "some simple actors" do
|
|
||||||
test "basic actor live cycle" do
|
|
||||||
this = self()
|
|
||||||
ac = Actor.create(fn msg -> send(this, msg) end)
|
|
||||||
Actor.send_message(ac, "Hello Actor!")
|
|
||||||
Actor.become(ac, fn _msg -> send(this, "Goodbye") end)
|
|
||||||
Actor.send_message(ac, "Hello Actor!")
|
|
||||||
Actor.stop(ac)
|
|
||||||
assert_receive "Hello Actor!"
|
|
||||||
assert_receive "Goodbye"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Loading…
Add table
Reference in a new issue