aboutsummaryrefslogtreecommitdiff
path: root/aoc2023/build/packages/adglent/src/showtime@internal@common@common_event_handler.erl
blob: b0a6d7a1d1fad460b767c9618ab7253c6dc67993 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
-module(showtime@internal@common@common_event_handler).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function]).

-export([handle_event/3]).
-export_type([test_state/0, handler_state/0]).

-type test_state() :: not_started | running | {finished, integer()}.

-type handler_state() :: {handler_state,
        test_state(),
        integer(),
        gleam@map:map_(binary(), gleam@map:map_(binary(), showtime@internal@common@test_suite:test_run()))}.

-spec handle_event(
    showtime@internal@common@test_suite:test_event(),
    fun(() -> integer()),
    handler_state()
) -> handler_state().
handle_event(Msg, System_time, State) ->
    Test_state = erlang:element(2, State),
    Num_done = erlang:element(3, State),
    Events = erlang:element(4, State),
    {Updated_test_state, Updated_num_done, Updated_events} = case Msg of
        start_test_run ->
            {running, Num_done, Events};

        {start_test_suite, Module} ->
            Maybe_module_events = gleam@map:get(
                Events,
                erlang:element(2, Module)
            ),
            New_events = case Maybe_module_events of
                {ok, _} ->
                    Events;

                {error, _} ->
                    _pipe = Events,
                    gleam@map:insert(
                        _pipe,
                        erlang:element(2, Module),
                        gleam@map:new()
                    )
            end,
            {Test_state, Num_done, New_events};

        {start_test, Module@1, Test} ->
            Current_time = System_time(),
            Maybe_module_events@1 = gleam@map:get(
                Events,
                erlang:element(2, Module@1)
            ),
            New_events@1 = case Maybe_module_events@1 of
                {ok, Module_events} ->
                    Maybe_test_event = gleam@map:get(
                        Module_events,
                        erlang:element(2, Test)
                    ),
                    case Maybe_test_event of
                        {error, _} ->
                            _pipe@1 = Events,
                            gleam@map:insert(
                                _pipe@1,
                                erlang:element(2, Module@1),
                                begin
                                    _pipe@2 = Module_events,
                                    gleam@map:insert(
                                        _pipe@2,
                                        erlang:element(2, Test),
                                        {ongoing_test_run, Test, Current_time}
                                    )
                                end
                            );

                        {ok, _} ->
                            Events
                    end;

                {error, _} ->
                    Events
            end,
            {Test_state, Num_done, New_events@1};

        {end_test, Module@2, Test@1, Result} ->
            Current_time@1 = System_time(),
            Maybe_module_events@2 = gleam@map:get(
                Events,
                erlang:element(2, Module@2)
            ),
            New_events@2 = case Maybe_module_events@2 of
                {ok, Module_events@1} ->
                    Maybe_test_run = begin
                        _pipe@3 = Module_events@1,
                        gleam@map:get(_pipe@3, erlang:element(2, Test@1))
                    end,
                    Updated_module_events = case Maybe_test_run of
                        {ok, {ongoing_test_run, Test_function, Started_at}} ->
                            _pipe@4 = Module_events@1,
                            gleam@map:insert(
                                _pipe@4,
                                erlang:element(2, Test@1),
                                {completed_test_run,
                                    Test_function,
                                    Current_time@1 - Started_at,
                                    Result}
                            );

                        {error, _} ->
                            Module_events@1
                    end,
                    _pipe@5 = Events,
                    gleam@map:insert(
                        _pipe@5,
                        erlang:element(2, Module@2),
                        Updated_module_events
                    );

                {error, _} ->
                    Events
            end,
            {Test_state, Num_done, New_events@2};

        {end_test_suite, _} ->
            {Test_state, Num_done + 1, Events};

        {end_test_run, Num_modules} ->
            {{finished, Num_modules}, Num_done, Events};

        _ ->
            {running, Num_done, Events}
    end,
    {handler_state, Updated_test_state, Updated_num_done, Updated_events}.