rpn-calculator-inspection
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
defmodule RPNCalculatorInspection do
|
||||
def start_reliability_check(calculator, input) do
|
||||
%{input: input, pid: spawn_link(fn -> calculator.(input) end)}
|
||||
end
|
||||
|
||||
def await_reliability_check_result(%{pid: pid, input: input}, results) do
|
||||
receive do
|
||||
{:EXIT, ^pid, :normal} -> Map.put(results, input, :ok)
|
||||
{:EXIT, ^pid, _reason} -> Map.put(results, input, :error)
|
||||
after
|
||||
100 -> Map.put(results, input, :timeout)
|
||||
end
|
||||
end
|
||||
|
||||
def reliability_check(calculator, inputs) do
|
||||
trap_exit_state = Process.flag(:trap_exit, true)
|
||||
|
||||
inputs
|
||||
|> Enum.map(&start_reliability_check(calculator, &1))
|
||||
|> Enum.reduce(%{}, &await_reliability_check_result/2)
|
||||
|> tap(fn _ -> Process.flag(:trap_exit, trap_exit_state) end)
|
||||
end
|
||||
|
||||
def correctness_check(calculator, inputs) do
|
||||
inputs
|
||||
|> Enum.map(&Task.async(fn -> calculator.(&1) end))
|
||||
|> Enum.map(&Task.await(&1, 100))
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user