separate dummy hello and real actor tests; actor (and test) improvements

This commit is contained in:
Helmut Merz 2026-04-19 12:04:27 +02:00
parent 51e3426202
commit 08688355f5
5 changed files with 45 additions and 38 deletions

View file

@ -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

View file

@ -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
View 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
View file

@ -0,0 +1,9 @@
defmodule HelloTest do
use ExUnit.Case
doctest Hello
test "greets the world" do
assert Hello.hello() == :world
end
end

View file

@ -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