Skip to content

Commit c602fed

Browse files
author
Bernard Pietraga
committed
Add exercises 4 and 5 from chapter 14
1 parent eda5621 commit c602fed

File tree

3 files changed

+153
-0
lines changed

3 files changed

+153
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
defmodule Linker2 do
2+
import :timer, only: [sleep: 1]
3+
4+
def notify(sender) do
5+
send sender, "Hello Kermit!"
6+
raise RuntimeError, message: "Child raised error"
7+
end
8+
9+
def read_message do
10+
receive do
11+
msg ->
12+
IO.puts "MESSAGE RECIEVED #{inspect msg}"
13+
read_message()
14+
after 0 ->
15+
IO.puts "No more messages in mailbox"
16+
end
17+
end
18+
19+
def run do
20+
Process.flag(:trap_exit, true)
21+
spawn_link(Linker2, :notify, [self()])
22+
:timer.sleep(500)
23+
read_message()
24+
end
25+
end
26+
27+
28+
ExUnit.start
29+
30+
defmodule Linker2Test do
31+
use ExUnit.Case
32+
import ExUnit.CaptureIO
33+
34+
test "run returns proper messages" do
35+
messages_string = """
36+
MESSAGE RECIEVED \"Hello Kermit!\"
37+
MESSAGE RECIEVED {:EXIT, #PID<0.95.0>, {%RuntimeError{message: \"Child raised error\"}, [{Linker2, :notify, 1, [file: 'working_with_multiple_processes_4.exs', line: 6]}]}}
38+
No more messages in mailbox
39+
"""
40+
41+
expected = capture_io fn ->
42+
Linker2.run
43+
end
44+
45+
assert expected == messages_string
46+
end
47+
end
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
defmodule Linker3 do
2+
import :timer, only: [sleep: 1]
3+
4+
def notify(sender) do
5+
send sender, "Hello Kermit!"
6+
exit(:boom)
7+
end
8+
9+
def read_message do
10+
receive do
11+
msg ->
12+
IO.puts "MESSAGE RECIEVED #{inspect msg}"
13+
read_message()
14+
after 0 ->
15+
IO.puts "No more messages in mailbox"
16+
end
17+
end
18+
19+
def run do
20+
Process.flag(:trap_exit, true)
21+
spawn_monitor(Linker3, :notify, [self()])
22+
:timer.sleep(500)
23+
read_message()
24+
end
25+
end
26+
27+
28+
ExUnit.start
29+
30+
defmodule Linker3Test do
31+
use ExUnit.Case
32+
import ExUnit.CaptureIO
33+
34+
test "run returns proper messages" do
35+
# Use regex as dynamicaly reference changes
36+
{:ok, regex_1} = Regex.compile("MESSAGE RECIEVED \"Hello Kermit!\"")
37+
{:ok, regex_2} = Regex.compile("MESSAGE RECIEVED {:DOWN, ")
38+
{:ok, regex_3} = Regex.compile("No more messages in mailbox")
39+
40+
expected = capture_io fn ->
41+
Linker3.run
42+
end
43+
44+
assert Regex.match?(regex_1, expected)
45+
assert Regex.match?(regex_2, expected)
46+
assert Regex.match?(regex_3, expected)
47+
end
48+
end
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
2+
defmodule Linker4 do
3+
import :timer, only: [sleep: 1]
4+
5+
def notify(sender) do
6+
send sender, "Hello Kermit!"
7+
raise RuntimeError, message: "Child raised error"
8+
end
9+
10+
def read_message do
11+
receive do
12+
msg ->
13+
IO.puts "MESSAGE RECIEVED #{inspect msg}"
14+
read_message()
15+
after 0 ->
16+
IO.puts "No more messages in mailbox"
17+
end
18+
end
19+
20+
def run do
21+
Process.flag(:trap_exit, true)
22+
spawn_monitor(Linker4, :notify, [self()])
23+
:timer.sleep(500)
24+
read_message()
25+
end
26+
end
27+
28+
29+
ExUnit.start
30+
31+
defmodule Linker4Test do
32+
use ExUnit.Case
33+
import ExUnit.CaptureIO
34+
35+
test "run returns proper messages" do
36+
{:ok, regex_1} = Regex.compile("MESSAGE RECIEVED \"Hello Kermit!\"")
37+
{:ok, regex_2} = Regex.compile("MESSAGE RECIEVED {:DOWN, ")
38+
{:ok, regex_3} = Regex.compile("{%RuntimeError{message: ")
39+
{:ok, regex_4} = Regex.compile("\"Child raised error\"}, ")
40+
{:ok, regex_5} = Regex.compile("Linker4, :notify, 1")
41+
{:ok, regex_6} = Regex.compile("file: 'working_with_multiple_processes_5_b.exs',")
42+
43+
messages_string = """
44+
No more messages in mailbox
45+
"""
46+
47+
expected = capture_io fn ->
48+
Linker4.run
49+
end
50+
51+
assert Regex.match?(regex_1, expected)
52+
assert Regex.match?(regex_2, expected)
53+
assert Regex.match?(regex_3, expected)
54+
assert Regex.match?(regex_4, expected)
55+
assert Regex.match?(regex_5, expected)
56+
assert Regex.match?(regex_6, expected)
57+
end
58+
end

0 commit comments

Comments
 (0)