Current section
Files
Jump to
Current section
Files
src/startest@test_failure.erl
-module(startest@test_failure).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([to_string/1, rescue/1]).
-export_type([test_failure/0, panic_info/0, panic_key/0]).
-type test_failure() :: {assertion_error,
startest@assertion_error:rescued_assertion_error()} |
{generic_error, exception:exception()}.
-type panic_info() :: {panic_info, binary(), binary(), integer(), binary()}.
-type panic_key() :: module | function | message | line.
-spec to_string(test_failure()) -> binary().
to_string(Failure) ->
case Failure of
{assertion_error, Assertion_error} ->
erlang:element(2, Assertion_error);
{generic_error, Exception} ->
gleam@string:inspect(Exception)
end.
-spec try_decode_panic_info(exception:exception()) -> {ok, panic_info()} |
{error, nil}.
try_decode_panic_info(Exception) ->
Err@1 = case Exception of
{errored, Err} ->
Err;
{thrown, Err} ->
Err;
{exited, Err} ->
Err
end,
case gleam@dynamic:classify(Err@1) of
<<"Dict"/utf8>> ->
gleam@result:'try'(
begin
_pipe = Err@1,
_pipe@1 = (gleam@dynamic:dict(
fun gleam@dynamic:dynamic/1,
fun gleam@dynamic:dynamic/1
))(_pipe),
gleam@result:nil_error(_pipe@1)
end,
fun(Dict) ->
gleam@result:'try'(
begin
_pipe@2 = Dict,
_pipe@3 = gleam@dict:get(
_pipe@2,
gleam@dynamic:from(module)
),
gleam@result:then(
_pipe@3,
fun(Value) -> _pipe@4 = Value,
_pipe@5 = gleam@dynamic:string(_pipe@4),
gleam@result:nil_error(_pipe@5) end
)
end,
fun(Module) ->
gleam@result:'try'(
begin
_pipe@6 = Dict,
_pipe@7 = gleam@dict:get(
_pipe@6,
gleam@dynamic:from(function)
),
gleam@result:then(
_pipe@7,
fun(Value@1) -> _pipe@8 = Value@1,
_pipe@9 = gleam@dynamic:string(
_pipe@8
),
gleam@result:nil_error(_pipe@9) end
)
end,
fun(Function) ->
gleam@result:'try'(
begin
_pipe@10 = Dict,
_pipe@11 = gleam@dict:get(
_pipe@10,
gleam@dynamic:from(line)
),
gleam@result:then(
_pipe@11,
fun(Value@2) ->
_pipe@12 = Value@2,
_pipe@13 = gleam@dynamic:int(
_pipe@12
),
gleam@result:nil_error(
_pipe@13
)
end
)
end,
fun(Line) ->
gleam@result:'try'(
begin
_pipe@14 = Dict,
_pipe@15 = gleam@dict:get(
_pipe@14,
gleam@dynamic:from(
message
)
),
gleam@result:then(
_pipe@15,
fun(Value@3) ->
_pipe@16 = Value@3,
_pipe@17 = gleam@dynamic:string(
_pipe@16
),
gleam@result:nil_error(
_pipe@17
)
end
)
end,
fun(Message) ->
{ok,
{panic_info,
Module,
Function,
Line,
Message}}
end
)
end
)
end
)
end
)
end
);
<<"Object"/utf8>> ->
gleam@result:'try'(
begin
_pipe@18 = Err@1,
_pipe@19 = (gleam@dynamic:field(
<<"module"/utf8>>,
fun gleam@dynamic:string/1
))(_pipe@18),
gleam@result:nil_error(_pipe@19)
end,
fun(Module@1) ->
gleam@result:'try'(
begin
_pipe@20 = Err@1,
_pipe@21 = (gleam@dynamic:field(
<<"fn"/utf8>>,
fun gleam@dynamic:string/1
))(_pipe@20),
gleam@result:nil_error(_pipe@21)
end,
fun(Function@1) ->
gleam@result:'try'(
begin
_pipe@22 = Err@1,
_pipe@23 = (gleam@dynamic:field(
<<"line"/utf8>>,
fun gleam@dynamic:int/1
))(_pipe@22),
gleam@result:nil_error(_pipe@23)
end,
fun(Line@1) ->
gleam@result:'try'(
begin
_pipe@24 = Err@1,
_pipe@25 = (gleam@dynamic:field(
<<"message"/utf8>>,
fun gleam@dynamic:string/1
))(_pipe@24),
gleam@result:nil_error(_pipe@25)
end,
fun(Message@1) ->
{ok,
{panic_info,
Module@1,
Function@1,
Line@1,
Message@1}}
end
)
end
)
end
)
end
);
_ ->
{error, nil}
end.
-spec rescue(fun(() -> nil)) -> {ok, nil} | {error, test_failure()}.
rescue(F) ->
case exception_ffi:rescue(F) of
{ok, nil} ->
{ok, nil};
{error, Exception} ->
Panic_info = begin
_pipe = Exception,
try_decode_panic_info(_pipe)
end,
case Panic_info of
{ok, Panic_info@1} ->
{error,
{assertion_error,
{rescued_assertion_error,
erlang:element(5, Panic_info@1)}}};
{error, nil} ->
{error, {generic_error, Exception}}
end
end.