@@ -74,7 +74,7 @@ local function assertion_to_node(test, assertion)
74
74
return node
75
75
end
76
76
77
- local function report_to_node (report )
77
+ local function report_to_node (report , is_expanded )
78
78
local report_line = report_to_line (report )
79
79
80
80
local children = {}
@@ -85,19 +85,66 @@ local function report_to_node(report)
85
85
local node = NuiTree .Node ({
86
86
line = report_line ,
87
87
test = report .test ,
88
+ report = report ,
88
89
}, children )
89
90
90
- if report .status == " failed" then
91
+ if report .status == " failed" or is_expanded then
91
92
node :expand ()
92
93
end
93
94
return node
94
95
end
95
96
96
- local function reports_to_nodes (reports )
97
+ local function reports_to_nodes (reports , prev_nodes )
98
+ local prev_nodes_by_test = {}
99
+ for _ , node in ipairs (prev_nodes ) do
100
+ prev_nodes_by_test [node .test ] = node
101
+ end
102
+
97
103
local nodes = {}
98
104
for _ , report in pairs (reports ) do
99
- table.insert (nodes , report_to_node (report ))
105
+ local prev_node = prev_nodes_by_test [report .test ]
106
+ local is_expanded = prev_node and prev_node :is_expanded ()
107
+ table.insert (nodes , report_to_node (report , is_expanded ))
108
+ end
109
+
110
+ local curr_map = {}
111
+ for _ , node in ipairs (nodes ) do
112
+ curr_map [node .test ] = node
100
113
end
114
+
115
+ local moved = { failed = {}, passed = {}, pending = {} }
116
+ local grouped = { failed = {}, passed = {}, pending = {} }
117
+
118
+ for _ , prev in ipairs (prev_nodes ) do
119
+ local current = curr_map [prev .test ]
120
+ if current then
121
+ local prev_status = prev .report .status
122
+ local curr_status = current .report .status
123
+ if prev_status == curr_status then
124
+ table.insert (grouped [curr_status ], current )
125
+ elseif prev_status == " pending" and (curr_status == " failed" or curr_status == " passed" ) then
126
+ table.insert (moved [curr_status ], current )
127
+ else
128
+ table.insert (grouped [curr_status ], current )
129
+ end
130
+ curr_map [prev .test ] = nil
131
+ end
132
+ end
133
+
134
+ for _ , node in pairs (curr_map ) do
135
+ table.insert (grouped [node .report .status ], node )
136
+ end
137
+
138
+ nodes = {}
139
+ for _ , status in ipairs ({ " failed" , " passed" , " pending" }) do
140
+ for _ , n in ipairs (grouped [status ]) do
141
+ table.insert (nodes , n )
142
+ end
143
+ for _ , n in ipairs (moved [status ]) do
144
+ table.insert (nodes , n )
145
+ end
146
+ end
147
+
101
148
return nodes
102
149
end
103
150
@@ -195,7 +242,7 @@ function M.create(window, on_event)
195
242
end , {})
196
243
197
244
function ReportTree :render_reports (reports )
198
- tree :set_nodes (reports_to_nodes (reports ))
245
+ tree :set_nodes (reports_to_nodes (reports , tree : get_nodes () ))
199
246
tree :render ()
200
247
end
201
248
0 commit comments