343 lines
13 KiB
Erlang
343 lines
13 KiB
Erlang
-module(gleeunit@internal@reporting).
|
|
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
|
|
-define(FILEPATH, "src/gleeunit/internal/reporting.gleam").
|
|
-export([new_state/0, test_skipped/3, test_passed/1, finished/1, eunit_missing/0, test_failed/4]).
|
|
-export_type([state/0]).
|
|
|
|
-if(?OTP_RELEASE >= 27).
|
|
-define(MODULEDOC(Str), -moduledoc(Str)).
|
|
-define(DOC(Str), -doc(Str)).
|
|
-else.
|
|
-define(MODULEDOC(Str), -compile([])).
|
|
-define(DOC(Str), -compile([])).
|
|
-endif.
|
|
|
|
?MODULEDOC(false).
|
|
|
|
-type state() :: {state, integer(), integer(), integer()}.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 15).
|
|
?DOC(false).
|
|
-spec new_state() -> state().
|
|
new_state() ->
|
|
{state, 0, 0, 0}.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 207).
|
|
?DOC(false).
|
|
-spec bold(binary()) -> binary().
|
|
bold(Text) ->
|
|
<<<<"\x{001b}[1m"/utf8, Text/binary>>/binary, "\x{001b}[22m"/utf8>>.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 211).
|
|
?DOC(false).
|
|
-spec cyan(binary()) -> binary().
|
|
cyan(Text) ->
|
|
<<<<"\x{001b}[36m"/utf8, Text/binary>>/binary, "\x{001b}[39m"/utf8>>.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 191).
|
|
?DOC(false).
|
|
-spec code_snippet(gleam@option:option(bitstring()), integer(), integer()) -> binary().
|
|
code_snippet(Src, Start, End) ->
|
|
_pipe = begin
|
|
gleam@result:'try'(
|
|
gleam@option:to_result(Src, nil),
|
|
fun(Src@1) ->
|
|
gleam@result:'try'(
|
|
gleam_stdlib:bit_array_slice(Src@1, Start, End - Start),
|
|
fun(Snippet) ->
|
|
gleam@result:'try'(
|
|
gleam@bit_array:to_string(Snippet),
|
|
fun(Snippet@1) ->
|
|
Snippet@2 = <<<<<<(cyan(<<" code"/utf8>>))/binary,
|
|
": "/utf8>>/binary,
|
|
Snippet@1/binary>>/binary,
|
|
"\n"/utf8>>,
|
|
{ok, Snippet@2}
|
|
end
|
|
)
|
|
end
|
|
)
|
|
end
|
|
)
|
|
end,
|
|
gleam@result:unwrap(_pipe, <<""/utf8>>).
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 215).
|
|
?DOC(false).
|
|
-spec yellow(binary()) -> binary().
|
|
yellow(Text) ->
|
|
<<<<"\x{001b}[33m"/utf8, Text/binary>>/binary, "\x{001b}[39m"/utf8>>.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 202).
|
|
?DOC(false).
|
|
-spec test_skipped(state(), binary(), binary()) -> state().
|
|
test_skipped(State, Module, Function) ->
|
|
gleam_stdlib:print(
|
|
<<<<<<<<"\n"/utf8, Module/binary>>/binary, "."/utf8>>/binary,
|
|
Function/binary>>/binary,
|
|
(yellow(<<" skipped"/utf8>>))/binary>>
|
|
),
|
|
{state,
|
|
erlang:element(2, State),
|
|
erlang:element(3, State),
|
|
erlang:element(4, State) + 1}.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 219).
|
|
?DOC(false).
|
|
-spec green(binary()) -> binary().
|
|
green(Text) ->
|
|
<<<<"\x{001b}[32m"/utf8, Text/binary>>/binary, "\x{001b}[39m"/utf8>>.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 66).
|
|
?DOC(false).
|
|
-spec test_passed(state()) -> state().
|
|
test_passed(State) ->
|
|
gleam_stdlib:print(green(<<"."/utf8>>)),
|
|
{state,
|
|
erlang:element(2, State) + 1,
|
|
erlang:element(3, State),
|
|
erlang:element(4, State)}.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 223).
|
|
?DOC(false).
|
|
-spec red(binary()) -> binary().
|
|
red(Text) ->
|
|
<<<<"\x{001b}[31m"/utf8, Text/binary>>/binary, "\x{001b}[39m"/utf8>>.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 19).
|
|
?DOC(false).
|
|
-spec finished(state()) -> integer().
|
|
finished(State) ->
|
|
case State of
|
|
{state, 0, 0, 0} ->
|
|
gleam_stdlib:println(<<"\nNo tests found!"/utf8>>),
|
|
1;
|
|
|
|
{state, _, 0, 0} ->
|
|
Message = <<<<"\n"/utf8,
|
|
(erlang:integer_to_binary(erlang:element(2, State)))/binary>>/binary,
|
|
" passed, no failures"/utf8>>,
|
|
gleam_stdlib:println(green(Message)),
|
|
0;
|
|
|
|
{state, _, _, 0} ->
|
|
Message@1 = <<<<<<<<"\n"/utf8,
|
|
(erlang:integer_to_binary(erlang:element(2, State)))/binary>>/binary,
|
|
" passed, "/utf8>>/binary,
|
|
(erlang:integer_to_binary(erlang:element(3, State)))/binary>>/binary,
|
|
" failures"/utf8>>,
|
|
gleam_stdlib:println(red(Message@1)),
|
|
1;
|
|
|
|
{state, _, 0, _} ->
|
|
Message@2 = <<<<<<<<"\n"/utf8,
|
|
(erlang:integer_to_binary(erlang:element(2, State)))/binary>>/binary,
|
|
" passed, 0 failures, "/utf8>>/binary,
|
|
(erlang:integer_to_binary(erlang:element(4, State)))/binary>>/binary,
|
|
" skipped"/utf8>>,
|
|
gleam_stdlib:println(yellow(Message@2)),
|
|
1;
|
|
|
|
{state, _, _, _} ->
|
|
Message@3 = <<<<<<<<<<<<"\n"/utf8,
|
|
(erlang:integer_to_binary(
|
|
erlang:element(2, State)
|
|
))/binary>>/binary,
|
|
" passed, "/utf8>>/binary,
|
|
(erlang:integer_to_binary(erlang:element(3, State)))/binary>>/binary,
|
|
" failures, "/utf8>>/binary,
|
|
(erlang:integer_to_binary(erlang:element(4, State)))/binary>>/binary,
|
|
" skipped"/utf8>>,
|
|
gleam_stdlib:println(red(Message@3)),
|
|
1
|
|
end.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 89).
|
|
?DOC(false).
|
|
-spec eunit_missing() -> {ok, any()} | {error, nil}.
|
|
eunit_missing() ->
|
|
Message = <<(bold(red(<<"Error"/utf8>>)))/binary,
|
|
": EUnit libraries not found.
|
|
|
|
Your Erlang installation seems to be incomplete. If you installed Erlang using
|
|
a package manager ensure that you have installed the full Erlang
|
|
distribution instead of a stripped-down version.
|
|
"/utf8>>,
|
|
gleam_stdlib:print_error(Message),
|
|
{error, nil}.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 227).
|
|
?DOC(false).
|
|
-spec grey(binary()) -> binary().
|
|
grey(Text) ->
|
|
<<<<"\x{001b}[90m"/utf8, Text/binary>>/binary, "\x{001b}[39m"/utf8>>.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 100).
|
|
?DOC(false).
|
|
-spec format_unknown(binary(), binary(), gleam@dynamic:dynamic_()) -> binary().
|
|
format_unknown(Module, Function, Error) ->
|
|
erlang:list_to_binary(
|
|
[<<(grey(<<<<Module/binary, "."/utf8>>/binary, Function/binary>>))/binary,
|
|
"\n"/utf8>>,
|
|
<<"An unexpected error occurred:\n"/utf8>>,
|
|
<<"\n"/utf8>>,
|
|
<<<<" "/utf8, (gleam@string:inspect(Error))/binary>>/binary,
|
|
"\n"/utf8>>]
|
|
).
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 183).
|
|
?DOC(false).
|
|
-spec inspect_value(gleeunit@internal@gleam_panic:asserted_expression()) -> binary().
|
|
inspect_value(Value) ->
|
|
case erlang:element(4, Value) of
|
|
unevaluated ->
|
|
grey(<<"unevaluated"/utf8>>);
|
|
|
|
{literal, _} ->
|
|
grey(<<"literal"/utf8>>);
|
|
|
|
{expression, Value@1} ->
|
|
gleam@string:inspect(Value@1)
|
|
end.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 179).
|
|
?DOC(false).
|
|
-spec assert_value(
|
|
binary(),
|
|
gleeunit@internal@gleam_panic:asserted_expression()
|
|
) -> binary().
|
|
assert_value(Name, Value) ->
|
|
<<<<<<(cyan(Name))/binary, ": "/utf8>>/binary,
|
|
(inspect_value(Value))/binary>>/binary,
|
|
"\n"/utf8>>.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 160).
|
|
?DOC(false).
|
|
-spec assert_info(gleeunit@internal@gleam_panic:assert_kind()) -> binary().
|
|
assert_info(Kind) ->
|
|
case Kind of
|
|
{binary_operator, _, Left, Right} ->
|
|
erlang:list_to_binary(
|
|
[assert_value(<<" left"/utf8>>, Left),
|
|
assert_value(<<"right"/utf8>>, Right)]
|
|
);
|
|
|
|
{function_call, Arguments} ->
|
|
_pipe = Arguments,
|
|
_pipe@1 = gleam@list:index_map(
|
|
_pipe,
|
|
fun(E, I) ->
|
|
Number = gleam@string:pad_start(
|
|
erlang:integer_to_binary(I),
|
|
5,
|
|
<<" "/utf8>>
|
|
),
|
|
assert_value(Number, E)
|
|
end
|
|
),
|
|
erlang:list_to_binary(_pipe@1);
|
|
|
|
{other_expression, _} ->
|
|
<<""/utf8>>
|
|
end.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 113).
|
|
?DOC(false).
|
|
-spec format_gleam_error(
|
|
gleeunit@internal@gleam_panic:gleam_panic(),
|
|
binary(),
|
|
binary(),
|
|
gleam@option:option(bitstring())
|
|
) -> binary().
|
|
format_gleam_error(Error, Module, Function, Src) ->
|
|
Location = grey(
|
|
<<<<(erlang:element(3, Error))/binary, ":"/utf8>>/binary,
|
|
(erlang:integer_to_binary(erlang:element(6, Error)))/binary>>
|
|
),
|
|
case erlang:element(7, Error) of
|
|
panic ->
|
|
erlang:list_to_binary(
|
|
[<<<<<<(bold(red(<<"panic"/utf8>>)))/binary, " "/utf8>>/binary,
|
|
Location/binary>>/binary,
|
|
"\n"/utf8>>,
|
|
<<<<<<<<<<(cyan(<<" test"/utf8>>))/binary, ": "/utf8>>/binary,
|
|
Module/binary>>/binary,
|
|
"."/utf8>>/binary,
|
|
Function/binary>>/binary,
|
|
"\n"/utf8>>,
|
|
<<<<<<(cyan(<<" info"/utf8>>))/binary, ": "/utf8>>/binary,
|
|
(erlang:element(2, Error))/binary>>/binary,
|
|
"\n"/utf8>>]
|
|
);
|
|
|
|
todo ->
|
|
erlang:list_to_binary(
|
|
[<<<<<<(bold(yellow(<<"todo"/utf8>>)))/binary, " "/utf8>>/binary,
|
|
Location/binary>>/binary,
|
|
"\n"/utf8>>,
|
|
<<<<<<<<<<(cyan(<<" test"/utf8>>))/binary, ": "/utf8>>/binary,
|
|
Module/binary>>/binary,
|
|
"."/utf8>>/binary,
|
|
Function/binary>>/binary,
|
|
"\n"/utf8>>,
|
|
<<<<<<(cyan(<<" info"/utf8>>))/binary, ": "/utf8>>/binary,
|
|
(erlang:element(2, Error))/binary>>/binary,
|
|
"\n"/utf8>>]
|
|
);
|
|
|
|
{assert, Start, End, _, Kind} ->
|
|
erlang:list_to_binary(
|
|
[<<<<<<(bold(red(<<"assert"/utf8>>)))/binary, " "/utf8>>/binary,
|
|
Location/binary>>/binary,
|
|
"\n"/utf8>>,
|
|
<<<<<<<<<<(cyan(<<" test"/utf8>>))/binary, ": "/utf8>>/binary,
|
|
Module/binary>>/binary,
|
|
"."/utf8>>/binary,
|
|
Function/binary>>/binary,
|
|
"\n"/utf8>>,
|
|
code_snippet(Src, Start, End),
|
|
assert_info(Kind),
|
|
<<<<<<(cyan(<<" info"/utf8>>))/binary, ": "/utf8>>/binary,
|
|
(erlang:element(2, Error))/binary>>/binary,
|
|
"\n"/utf8>>]
|
|
);
|
|
|
|
{let_assert, Start@1, End@1, _, _, Value} ->
|
|
erlang:list_to_binary(
|
|
[<<<<<<(bold(red(<<"let assert"/utf8>>)))/binary, " "/utf8>>/binary,
|
|
Location/binary>>/binary,
|
|
"\n"/utf8>>,
|
|
<<<<<<<<<<(cyan(<<" test"/utf8>>))/binary, ": "/utf8>>/binary,
|
|
Module/binary>>/binary,
|
|
"."/utf8>>/binary,
|
|
Function/binary>>/binary,
|
|
"\n"/utf8>>,
|
|
code_snippet(Src, Start@1, End@1),
|
|
<<<<<<(cyan(<<"value"/utf8>>))/binary, ": "/utf8>>/binary,
|
|
(gleam@string:inspect(Value))/binary>>/binary,
|
|
"\n"/utf8>>,
|
|
<<<<<<(cyan(<<" info"/utf8>>))/binary, ": "/utf8>>/binary,
|
|
(erlang:element(2, Error))/binary>>/binary,
|
|
"\n"/utf8>>]
|
|
)
|
|
end.
|
|
|
|
-file("src/gleeunit/internal/reporting.gleam", 71).
|
|
?DOC(false).
|
|
-spec test_failed(state(), binary(), binary(), gleam@dynamic:dynamic_()) -> state().
|
|
test_failed(State, Module, Function, Error) ->
|
|
Message = case gleeunit_gleam_panic_ffi:from_dynamic(Error) of
|
|
{ok, Error@1} ->
|
|
Src = gleam@option:from_result(
|
|
file:read_file(erlang:element(3, Error@1))
|
|
),
|
|
format_gleam_error(Error@1, Module, Function, Src);
|
|
|
|
{error, _} ->
|
|
format_unknown(Module, Function, Error)
|
|
end,
|
|
gleam_stdlib:print(<<"\n"/utf8, Message/binary>>),
|
|
{state,
|
|
erlang:element(2, State),
|
|
erlang:element(3, State) + 1,
|
|
erlang:element(4, State)}.
|