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
25
lib/actor.ex
25
lib/actor.ex
|
|
@ -1,12 +1,15 @@
|
|||
defmodule Xplore.Actor do
|
||||
|
||||
def loop(bhv) do
|
||||
receive do
|
||||
{:message, msg} ->
|
||||
bhv.(msg)
|
||||
loop(bhv)
|
||||
{:system, :become, bhv_n} -> loop(bhv_n)
|
||||
{:system, :quit} -> :quit
|
||||
defp loop(bhv) do
|
||||
receive do msg ->
|
||||
#IO.puts("receive: #{inspect msg}")
|
||||
case msg do
|
||||
{:message, msg} ->
|
||||
bhv.(msg)
|
||||
loop(bhv)
|
||||
{:become, bhv_n} -> loop(bhv_n)
|
||||
{:quit} -> nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -14,15 +17,15 @@ defmodule Xplore.Actor do
|
|||
spawn_link(fn -> loop(bhv) end)
|
||||
end
|
||||
|
||||
def send_message(ac, msg) do
|
||||
send(ac, {:message, msg})
|
||||
def send(ac, msg) do
|
||||
Kernel.send(ac, {:message, msg})
|
||||
end
|
||||
|
||||
def become(ac, bhv) do
|
||||
send(ac, {:system, :become, bhv})
|
||||
Kernel.send(ac, {:become, bhv})
|
||||
end
|
||||
|
||||
def stop(ac) do
|
||||
send(ac, {:system, :quit})
|
||||
Kernel.send(ac, {:quit})
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
defmodule Xplore do
|
||||
defmodule Hello do
|
||||
@moduledoc """
|
||||
Documentation for `Xplore`.
|
||||
Documentation for `Hello`.
|
||||
"""
|
||||
|
||||
@doc """
|
||||
|
|
@ -8,7 +8,7 @@ defmodule Xplore do
|
|||
|
||||
## Examples
|
||||
|
||||
iex> Xplore.hello()
|
||||
iex> Hello.hello()
|
||||
: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