@@ -57,9 +57,10 @@ defmodule ExUnit.Server do
57
57
state = % {
58
58
loaded: System . monotonic_time ( ) ,
59
59
waiting: nil ,
60
- async_groups: % { } ,
60
+ groups: % { } ,
61
+ async_groups: [ ] ,
61
62
async_modules: :queue . new ( ) ,
62
- sync_modules: :queue . new ( )
63
+ sync_modules: [ ]
63
64
}
64
65
65
66
{ :ok , state }
@@ -72,31 +73,31 @@ defmodule ExUnit.Server do
72
73
73
74
# Called once after all async modules have been sent and reverts the state.
74
75
def handle_call ( :take_sync_modules , _from , state ) do
75
- % { waiting: nil , loaded: :done , async_modules: async_modules } = state
76
- 0 = :queue . len ( async_modules )
76
+ % { waiting: nil , loaded: :done , async_groups: [ ] } = state
77
+ true = :queue . is_empty ( state . async_modules )
77
78
78
- { :reply , :queue . to_list ( state . sync_modules ) ,
79
- % { state | sync_modules: :queue . new ( ) , loaded: System . monotonic_time ( ) } }
79
+ { :reply , state . sync_modules , % { state | sync_modules: [ ] , loaded: System . monotonic_time ( ) } }
80
80
end
81
81
82
82
# Called by the runner when --repeat-until-failure is used.
83
83
def handle_call ( { :restore_modules , async_modules , sync_modules } , _from , state ) do
84
- { async_modules , async_groups } =
85
- Enum . map_reduce ( async_modules , % { } , fn
86
- { nil , [ module ] } , { modules , groups } ->
87
- { [ { : module, module } | modules ] , groups }
84
+ { async_modules , async_groups , groups } =
85
+ Enum . reduce ( async_modules , { [ ] , [ ] , [ ] } , fn
86
+ { nil , [ module ] } , { async_modules , async_groups , groups } ->
87
+ { [ module | async_modules ] , async_groups , groups }
88
88
89
- { group , group_modules } , { modules , groups } ->
90
- { [ { :group , group } | modules ] , Map . put ( groups , group , group_modules ) }
89
+ { group , group_modules } , { async_modules , async_groups , groups } ->
90
+ { async_modules , [ group | async_groups ] , [ { group , group_modules } | groups ] }
91
91
end )
92
92
93
93
{ :reply , :ok ,
94
94
% {
95
95
state
96
96
| loaded: :done ,
97
+ groups: Map . new ( groups ) ,
97
98
async_groups: async_groups ,
98
99
async_modules: :queue . from_list ( async_modules ) ,
99
- sync_modules: :queue . from_list ( sync_modules )
100
+ sync_modules: sync_modules
100
101
} }
101
102
end
102
103
@@ -108,22 +109,24 @@ defmodule ExUnit.Server do
108
109
when is_integer ( loaded ) do
109
110
state =
110
111
if uniq? do
111
- async_groups =
112
- Map . new ( state . async_groups , fn { group , modules } ->
113
- { group , Enum . uniq ( modules ) }
114
- end )
115
-
112
+ groups = Map . new ( state . groups , fn { group , modules } -> { group , Enum . uniq ( modules ) } end )
113
+ async_groups = state . async_groups |> Enum . uniq ( ) |> Enum . reverse ( )
116
114
async_modules = :queue . to_list ( state . async_modules ) |> Enum . uniq ( ) |> :queue . from_list ( )
117
- sync_modules = :queue . to_list ( state . sync_modules ) |> Enum . uniq ( ) |> :queue . from_list ( )
115
+ sync_modules = state . sync_modules |> Enum . uniq ( ) |> Enum . reverse ( )
118
116
119
117
% {
120
118
state
121
- | async_groups: async_groups ,
119
+ | groups: groups ,
120
+ async_groups: async_groups ,
122
121
async_modules: async_modules ,
123
122
sync_modules: sync_modules
124
123
}
125
124
else
126
- state
125
+ % {
126
+ state
127
+ | async_groups: Enum . reverse ( state . async_groups ) ,
128
+ sync_modules: Enum . reverse ( state . sync_modules )
129
+ }
127
130
end
128
131
129
132
diff = System . convert_time_unit ( System . monotonic_time ( ) - loaded , :native , :microsecond )
@@ -132,9 +135,7 @@ defmodule ExUnit.Server do
132
135
133
136
def handle_call ( { :add , false = _async , _group , names } , _from , % { loaded: loaded } = state )
134
137
when is_integer ( loaded ) do
135
- state =
136
- update_in ( state . sync_modules , & Enum . reduce ( names , & 1 , fn name , q -> :queue . in ( name , q ) end ) )
137
-
138
+ state = update_in ( state . sync_modules , & Enum . reverse ( names , & 1 ) )
138
139
{ :reply , :ok , state }
139
140
end
140
141
@@ -143,25 +144,24 @@ defmodule ExUnit.Server do
143
144
state =
144
145
update_in (
145
146
state . async_modules ,
146
- & Enum . reduce ( names , & 1 , fn name , q -> :queue . in ( { :module , name } , q ) end )
147
+ & Enum . reduce ( names , & 1 , fn name , q -> :queue . in ( name , q ) end )
147
148
)
148
149
149
150
{ :reply , :ok , take_modules ( state ) }
150
151
end
151
152
152
153
def handle_call ( { :add , true = _async , group , names } , _from , % { loaded: loaded } = state )
153
154
when is_integer ( loaded ) do
154
- { async_groups , async_modules } =
155
- case state . async_groups do
156
- % { ^ group => entries } = async_groups ->
157
- { % { async_groups | group => names ++ entries } , state . async_modules }
155
+ { groups , async_groups } =
156
+ case state . groups do
157
+ % { ^ group => entries } = groups ->
158
+ { % { groups | group => Enum . reverse ( names , entries ) } , state . async_groups }
158
159
159
- % { } = async_groups ->
160
- { Map . put ( async_groups , group , names ) , :queue . in ( { : group, group } , state . async_modules ) }
160
+ % { } = groups ->
161
+ { Map . put ( groups , group , names ) , [ group | state . async_groups ] }
161
162
end
162
163
163
- { :reply , :ok ,
164
- take_modules ( % { state | async_groups: async_groups , async_modules: async_modules } ) }
164
+ { :reply , :ok , take_modules ( % { state | groups: groups , async_groups: async_groups } ) }
165
165
end
166
166
167
167
def handle_call ( { :add , _async? , _group , _names } , _from , state ) do
@@ -174,49 +174,44 @@ defmodule ExUnit.Server do
174
174
175
175
defp take_modules ( % { waiting: { from , count } } = state ) do
176
176
has_async_modules? = not :queue . is_empty ( state . async_modules )
177
+ has_async_groups? = state . async_groups != [ ]
177
178
178
179
cond do
179
- not has_async_modules? and state . loaded == :done ->
180
+ not has_async_modules? and not has_async_groups? and state . loaded == :done ->
180
181
GenServer . reply ( from , nil )
181
182
% { state | waiting: nil }
182
183
183
- not has_async_modules? ->
184
- state
185
-
186
- true ->
187
- { async_modules , remaining_modules } = take_until ( count , state . async_modules )
184
+ has_async_modules? ->
185
+ { reply , remaining_modules } = take_until ( count , state . async_modules )
186
+ GenServer . reply ( from , reply )
187
+ % { state | async_modules: remaining_modules , waiting: nil }
188
188
189
- { async_modules , remaining_groups } =
190
- Enum . map_reduce ( async_modules , state . async_groups , fn
191
- { :module , module } , async_groups ->
192
- { [ module ] , async_groups }
189
+ has_async_groups? ->
190
+ { groups , remaining_groups } = Enum . split ( state . async_groups , count )
193
191
194
- { :group , group } , async_groups ->
195
- { group_modules , async_groups } = Map . pop! ( async_groups , group )
196
- { Enum . reverse ( group_modules ) , async_groups }
192
+ { reply , groups } =
193
+ Enum . map_reduce ( groups , state . groups , fn group , acc ->
194
+ { entries , acc } = Map . pop! ( acc , group )
195
+ { { group , Enum . reverse ( entries ) } , acc }
197
196
end )
198
197
199
- GenServer . reply ( from , async_modules )
198
+ GenServer . reply ( from , reply )
199
+ % { state | groups: groups , async_groups: remaining_groups , waiting: nil }
200
200
201
- % {
202
- state
203
- | async_groups: remaining_groups ,
204
- async_modules: remaining_modules ,
205
- waiting: nil
206
- }
201
+ true ->
202
+ state
207
203
end
208
204
end
209
205
210
- # :queue.split fails if the provided count is larger than the queue size;
211
- # as we also want to return the values as a list later, we directly
212
- # return {list, queue} instead of {queue, queue}
206
+ # :queue.split fails if the provided count is larger than the queue size.
207
+ # We also want to return the values as tuples of shape {group, [modules]}.
213
208
defp take_until ( n , queue ) , do: take_until ( n , queue , [ ] )
214
209
215
210
defp take_until ( 0 , queue , acc ) , do: { Enum . reverse ( acc ) , queue }
216
211
217
212
defp take_until ( n , queue , acc ) do
218
213
case :queue . out ( queue ) do
219
- { { :value , item } , queue } -> take_until ( n - 1 , queue , [ item | acc ] )
214
+ { { :value , item } , queue } -> take_until ( n - 1 , queue , [ { nil , [ item ] } | acc ] )
220
215
{ :empty , queue } -> { Enum . reverse ( acc ) , queue }
221
216
end
222
217
end
0 commit comments