@@ -81,72 +81,89 @@ mod baseline {
8181    } 
8282} 
8383
84- macro_rules!  mktest { 
85-     ( $name: ident,  $case: expr,  $number_of_lines: literal)  => { 
86-         #[ test] 
87-         fn  $name( )  { 
88-             let  worktree_path = fixture_path( ) ; 
84+ struct  Fixture  { 
85+     worktree_path :  PathBuf , 
86+     odb :  gix_odb:: Handle , 
87+     resource_cache :  gix_diff:: blob:: Platform , 
88+     commits :  Vec < Result < gix_traverse:: commit:: Info ,  gix_traverse:: commit:: simple:: Error > > , 
89+ } 
8990
90-             use  gix_ref:: store:: WriteReflog ; 
91+ impl  Fixture  { 
92+     fn  new ( )  -> gix_testtools:: Result < Fixture >  { 
93+         let  worktree_path = fixture_path ( ) ; 
94+         use  gix_ref:: store:: WriteReflog ; 
9195
92-              let  store = gix_ref:: file:: Store :: at( 
93-                  worktree_path. join( ".git" ) , 
94-                  gix_ref:: store:: init:: Options  { 
95-                      write_reflog:  WriteReflog :: Disable , 
96-                      ..Default :: default ( ) 
97-                  } , 
98-              ) ; 
99-              let  odb = gix_odb:: at( worktree_path. join( ".git/objects" ) ) . unwrap ( ) ; 
96+         let  store = gix_ref:: file:: Store :: at ( 
97+             worktree_path. join ( ".git" ) , 
98+             gix_ref:: store:: init:: Options  { 
99+                 write_reflog :  WriteReflog :: Disable , 
100+                 ..Default :: default ( ) 
101+             } , 
102+         ) ; 
103+         let  odb = gix_odb:: at ( worktree_path. join ( ".git/objects" ) ) ? ; 
100104
101-              let  mut  reference = gix_ref:: file:: Store :: find( & store,  "HEAD" ) . unwrap ( ) ; 
105+         let  mut  reference = gix_ref:: file:: Store :: find ( & store,  "HEAD" ) ? ; 
102106
103-              // Needed for `peel_to_id_in_place`. 
104-              use  gix_ref:: file:: ReferenceExt ; 
107+         // Needed for `peel_to_id_in_place`. 
108+         use  gix_ref:: file:: ReferenceExt ; 
105109
106-              let  head_id = reference. peel_to_id_in_place( & store,  & odb) . unwrap ( ) ; 
110+         let  head_id = reference. peel_to_id_in_place ( & store,  & odb) ? ; 
107111
108-              let  mut  traverse  = gix_traverse:: commit:: Simple :: new( Some ( head_id) ,  & odb) ; 
112+         let  commits :   Vec < _ >  = gix_traverse:: commit:: Simple :: new ( Some ( head_id) ,  & odb) . collect ( ) ; 
109113
110-             let  git_dir = worktree_path. join( ".git" ) ; 
111-             let  index = gix_index:: File :: at( 
112-                 git_dir. join( "index" ) , 
113-                 gix_hash:: Kind :: Sha1 , 
114-                 false , 
115-                 Default :: default ( ) , 
116-             ) 
117-             . unwrap( ) ; 
118-             let  stack = gix_worktree:: Stack :: from_state_and_ignore_case( 
119-                 worktree_path. clone( ) , 
120-                 false , 
121-                 gix_worktree:: stack:: State :: AttributesAndIgnoreStack  { 
122-                     attributes:  Default :: default ( ) , 
123-                     ignore:  Default :: default ( ) , 
114+         let  git_dir = worktree_path. join ( ".git" ) ; 
115+         let  index = gix_index:: File :: at ( git_dir. join ( "index" ) ,  gix_hash:: Kind :: Sha1 ,  false ,  Default :: default ( ) ) ?; 
116+         let  stack = gix_worktree:: Stack :: from_state_and_ignore_case ( 
117+             worktree_path. clone ( ) , 
118+             false , 
119+             gix_worktree:: stack:: State :: AttributesAndIgnoreStack  { 
120+                 attributes :  Default :: default ( ) , 
121+                 ignore :  Default :: default ( ) , 
122+             } , 
123+             & index, 
124+             index. path_backing ( ) , 
125+         ) ; 
126+         let  capabilities = gix_fs:: Capabilities :: probe ( & git_dir) ; 
127+         let  resource_cache = gix_diff:: blob:: Platform :: new ( 
128+             Default :: default ( ) , 
129+             gix_diff:: blob:: Pipeline :: new ( 
130+                 gix_diff:: blob:: pipeline:: WorktreeRoots  { 
131+                     old_root :  None , 
132+                     new_root :  None , 
133+                 } , 
134+                 gix_filter:: Pipeline :: new ( Default :: default ( ) ,  Default :: default ( ) ) , 
135+                 vec ! [ ] , 
136+                 gix_diff:: blob:: pipeline:: Options  { 
137+                     large_file_threshold_bytes :  0 , 
138+                     fs :  capabilities, 
124139                } , 
125-                 & index, 
126-                 index. path_backing( ) , 
127-             ) ; 
128-             let  capabilities = gix_fs:: Capabilities :: probe( & git_dir) ; 
129-             let  mut  resource_cache = gix_diff:: blob:: Platform :: new( 
130-                 Default :: default ( ) , 
131-                 gix_diff:: blob:: Pipeline :: new( 
132-                     gix_diff:: blob:: pipeline:: WorktreeRoots  { 
133-                         old_root:  None , 
134-                         new_root:  None , 
135-                     } , 
136-                     gix_filter:: Pipeline :: new( Default :: default ( ) ,  Default :: default ( ) ) , 
137-                     vec![ ] , 
138-                     gix_diff:: blob:: pipeline:: Options  { 
139-                         large_file_threshold_bytes:  0 , 
140-                         fs:  capabilities, 
141-                     } , 
142-                 ) , 
143-                 gix_diff:: blob:: pipeline:: Mode :: ToGit , 
144-                 stack, 
145-             ) ; 
140+             ) , 
141+             gix_diff:: blob:: pipeline:: Mode :: ToGit , 
142+             stack, 
143+         ) ; 
144+         Ok ( Fixture  { 
145+             odb, 
146+             worktree_path, 
147+             commits, 
148+             resource_cache, 
149+         } ) 
150+     } 
151+ } 
152+ 
153+ macro_rules!  mktest { 
154+     ( $name: ident,  $case: expr,  $number_of_lines: literal)  => { 
155+         #[ test] 
156+         fn  $name( )  { 
157+             let  Fixture  { 
158+                 worktree_path, 
159+                 odb, 
160+                 mut  resource_cache, 
161+                 commits, 
162+             }  = Fixture :: new( ) . unwrap( ) ; 
146163
147164            let  lines_blamed = blame_file( 
148165                & odb, 
149-                 & mut  traverse , 
166+                 commits , 
150167                & mut  resource_cache, 
151168                worktree_path, 
152169                format!( "{}.txt" ,  $case) . as_str( ) . into( ) , 
@@ -181,11 +198,36 @@ mktest!(added_line_before_changed_line, "added-line-before-changed-line", 3);
181198mktest ! ( same_line_changed_twice,  "same-line-changed-twice" ,  2 ) ; 
182199mktest ! ( coalesce_adjacent_hunks,  "coalesce-adjacent-hunks" ,  1 ) ; 
183200
201+ #[ test]  
202+ #[ ignore = "TBD: figure out what the problem is" ]  
184203// As of 2024-09-24, these tests are expected to fail. 
185204// 
186205// Context: https://github.com/Byron/gitoxide/pull/1453#issuecomment-2371013904 
187- mktest ! ( empty_lines_histogram,  "empty-lines-histogram" ,  5 ) ; 
188- mktest ! ( empty_lines_myers,  "empty-lines-myers" ,  5 ) ; 
206+ fn  diff_disparity ( )  { 
207+     for  case in  [ "empty-lines-myers" ,  "empty-lines-histogram" ]  { 
208+         let  Fixture  { 
209+             worktree_path, 
210+             odb, 
211+             mut  resource_cache, 
212+             commits, 
213+         }  = Fixture :: new ( ) . unwrap ( ) ; 
214+         let  lines_blamed = blame_file ( 
215+             & odb, 
216+             commits, 
217+             & mut  resource_cache, 
218+             worktree_path, 
219+             format ! ( "{case}.txt" ) . as_str ( ) . into ( ) , 
220+         ) 
221+         . unwrap ( ) ; 
222+ 
223+         assert_eq ! ( lines_blamed. len( ) ,  5 ) ; 
224+ 
225+         let  git_dir = fixture_path ( ) . join ( ".git" ) ; 
226+         let  baseline = Baseline :: collect ( git_dir. join ( format ! ( "{case}.baseline" ) ) ) . unwrap ( ) ; 
227+ 
228+         assert_eq ! ( lines_blamed,  baseline,  "{case}" ) ; 
229+     } 
230+ } 
189231
190232#[ test]  
191233fn  process_change_works ( )  { 
0 commit comments