-module(startest@test_tree). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([all_tests/1, decode_test_tree/1]). -export_type([test_tree/0]). -type test_tree() :: {suite, binary(), list(test_tree())} | {test, startest@test_case:test()}. -spec collect_all_tests( test_tree(), list(binary()), list({binary(), startest@test_case:test()}) ) -> list({binary(), startest@test_case:test()}). collect_all_tests(Tree, Path, Acc) -> case Tree of {suite, Name, Suite} -> _pipe = Suite, gleam@list:flat_map( _pipe, fun(_capture) -> collect_all_tests(_capture, [Name | Path], Acc) end ); {test, Test_case} -> Test_path = begin _pipe@1 = [erlang:element(2, Test_case) | Path], _pipe@2 = gleam@list:reverse(_pipe@1), gleam@string:join(_pipe@2, <<" ❯ "/utf8>>) end, [{Test_path, Test_case} | Acc] end. -spec all_tests(test_tree()) -> list({binary(), startest@test_case:test()}). all_tests(Tree) -> collect_all_tests(Tree, [], []). -spec decode_test_tree(gleam@dynamic:dynamic_()) -> {ok, test_tree()} | {error, list(gleam@dynamic:decode_error())}. decode_test_tree(Value) -> _pipe = Value, (gleam@dynamic:any( [gleam@dynamic:decode2( fun(Field@0, Field@1) -> {suite, Field@0, Field@1} end, gleam@dynamic:element(1, fun gleam@dynamic:string/1), gleam@dynamic:element( 2, gleam@dynamic:list(fun decode_test_tree/1) ) ), gleam@dynamic:decode1( fun(Field@0) -> {test, Field@0} end, gleam@dynamic:element(1, fun startest@test_case:decode_test/1) )] ))(_pipe).