30 lines
915 B
Elixir
30 lines
915 B
Elixir
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
|