@@ -74,7 +74,7 @@ local function assertion_to_node(test, assertion)
7474  return  node 
7575end 
7676
77- local  function  report_to_node (report )
77+ local  function  report_to_node (report ,  is_expanded )
7878  local  report_line  =  report_to_line (report )
7979
8080  local  children  =  {}
@@ -85,19 +85,66 @@ local function report_to_node(report)
8585  local  node  =  NuiTree .Node ({
8686    line  =  report_line ,
8787    test  =  report .test ,
88+     report  =  report ,
8889  }, children )
8990
90-   if  report .status  ==  " failed"  then 
91+   if  report .status  ==  " failed"  or   is_expanded   then 
9192    node :expand ()
9293  end 
9394  return  node 
9495end 
9596
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+ 
97103  local  nodes  =  {}
98104  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 
100113  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+ 
101148  return  nodes 
102149end 
103150
@@ -195,7 +242,7 @@ function M.create(window, on_event)
195242  end , {})
196243
197244  function  ReportTree :render_reports (reports )
198-     tree :set_nodes (reports_to_nodes (reports ))
245+     tree :set_nodes (reports_to_nodes (reports ,  tree : get_nodes () ))
199246    tree :render ()
200247  end 
201248
0 commit comments