3-way merge with Myers diff
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

merge3: rename test_ functions, make_accum → accum (merlint E330/E331)

+28 -28
+2 -2
lib/merge3.ml
··· 221 221 O(N) — pushing N lines is N constant-time operations, rather than the O(N²) 222 222 cost of repeated [a @ b] list concatenations. *) 223 223 224 - let make_accum () = { resolved_rev = []; chunks_rev = [] } 224 + let accum () = { resolved_rev = []; chunks_rev = [] } 225 225 226 226 let flush_resolved acc = 227 227 match acc.resolved_rev with ··· 258 258 let stable = 259 259 stable_points_of ~base (lcs ~eq base ours) (lcs ~eq base theirs) 260 260 in 261 - let acc = make_accum () in 261 + let acc = accum () in 262 262 let push_gap ~prev_b ~prev_o ~prev_t ~next_b ~next_o ~next_t = 263 263 match 264 264 classify_gap ~base ~ours ~theirs ~prev_b ~prev_o ~prev_t ~next_b ~next_o
+26 -26
test/test.ml
··· 5 5 6 6 (** {1 Myers diff tests} *) 7 7 8 - let test_diff_empty () = 8 + let diff_empty () = 9 9 let edits = Merge3.diff ~eq:String.equal [||] [||] in 10 10 Alcotest.(check int) "empty diff" 0 (List.length edits) 11 11 12 - let test_diff_insert () = 12 + let diff_insert () = 13 13 let a = [||] and b = [| "hello" |] in 14 14 let edits = Merge3.diff ~eq:String.equal a b in 15 15 Alcotest.(check int) "one insert" 1 (List.length edits); ··· 17 17 | [ Merge3.Insert "hello" ] -> () 18 18 | _ -> Alcotest.fail "expected Insert" 19 19 20 - let test_diff_delete () = 20 + let diff_delete () = 21 21 let a = [| "hello" |] and b = [||] in 22 22 let edits = Merge3.diff ~eq:String.equal a b in 23 23 Alcotest.(check int) "one delete" 1 (List.length edits); ··· 25 25 | [ Merge3.Delete "hello" ] -> () 26 26 | _ -> Alcotest.fail "expected Delete" 27 27 28 - let test_diff_keep () = 28 + let diff_keep () = 29 29 let a = [| "hello" |] and b = [| "hello" |] in 30 30 let edits = Merge3.diff ~eq:String.equal a b in 31 31 match edits with 32 32 | [ Merge3.Keep "hello" ] -> () 33 33 | _ -> Alcotest.fail "expected Keep" 34 34 35 - let test_diff_mixed () = 35 + let diff_mixed () = 36 36 let a = [| "a"; "b"; "c" |] and b = [| "a"; "x"; "c" |] in 37 37 let edits = Merge3.diff ~eq:String.equal a b in 38 38 let count_kind p = List.length (List.filter p edits) in ··· 46 46 "1 insert" 1 47 47 (count_kind (function Merge3.Insert _ -> true | _ -> false)) 48 48 49 - let test_lcs_basic () = 49 + let lcs_basic () = 50 50 let a = [| "a"; "b"; "c"; "d" |] and b = [| "a"; "c"; "d"; "e" |] in 51 51 let pairs = Merge3.lcs ~eq:String.equal a b in 52 52 Alcotest.(check int) "LCS length" 3 (List.length pairs) 53 53 54 54 (** {1 Combinator tests} *) 55 55 56 - let test_default_unchanged () = 56 + let default_unchanged () = 57 57 let eq = Int.equal in 58 58 match Merge3.default ~eq ~old:(Some 1) 1 1 with 59 59 | Merge3.Ok 1 -> () 60 60 | _ -> Alcotest.fail "expected Ok 1" 61 61 62 - let test_default_ours_changed () = 62 + let default_ours_changed () = 63 63 let eq = Int.equal in 64 64 match Merge3.default ~eq ~old:(Some 1) 2 1 with 65 65 | Merge3.Ok 2 -> () 66 66 | _ -> Alcotest.fail "expected Ok 2" 67 67 68 - let test_default_theirs_changed () = 68 + let default_theirs_changed () = 69 69 let eq = Int.equal in 70 70 match Merge3.default ~eq ~old:(Some 1) 1 3 with 71 71 | Merge3.Ok 3 -> () 72 72 | _ -> Alcotest.fail "expected Ok 3" 73 73 74 - let test_default_conflict () = 74 + let default_conflict () = 75 75 let eq = Int.equal in 76 76 match Merge3.default ~eq ~old:(Some 1) 2 3 with 77 77 | Merge3.Conflict _ -> () 78 78 | _ -> Alcotest.fail "expected Conflict" 79 79 80 - let test_default_both_same () = 80 + let default_both_same () = 81 81 let eq = Int.equal in 82 82 match Merge3.default ~eq ~old:(Some 1) 2 2 with 83 83 | Merge3.Ok 2 -> () ··· 85 85 86 86 (** {1 Merge result accessors} *) 87 87 88 - let test_has_conflicts_clean () = 88 + let has_conflicts_clean () = 89 89 let chunks = Merge3.merge ~base:"a\n" ~ours:"a\n" ~theirs:"a\n" () in 90 90 Alcotest.(check bool) "no conflicts" false (Merge3.has_conflicts chunks) 91 91 92 - let test_has_conflicts_dirty () = 92 + let has_conflicts_dirty () = 93 93 let chunks = Merge3.merge ~base:"a\n" ~ours:"x\n" ~theirs:"y\n" () in 94 94 Alcotest.(check bool) "has conflicts" true (Merge3.has_conflicts chunks) 95 95 ··· 100 100 [ 101 101 ( "diff", 102 102 [ 103 - Alcotest.test_case "empty" `Quick test_diff_empty; 104 - Alcotest.test_case "insert" `Quick test_diff_insert; 105 - Alcotest.test_case "delete" `Quick test_diff_delete; 106 - Alcotest.test_case "keep" `Quick test_diff_keep; 107 - Alcotest.test_case "mixed" `Quick test_diff_mixed; 108 - Alcotest.test_case "lcs" `Quick test_lcs_basic; 103 + Alcotest.test_case "empty" `Quick diff_empty; 104 + Alcotest.test_case "insert" `Quick diff_insert; 105 + Alcotest.test_case "delete" `Quick diff_delete; 106 + Alcotest.test_case "keep" `Quick diff_keep; 107 + Alcotest.test_case "mixed" `Quick diff_mixed; 108 + Alcotest.test_case "lcs" `Quick lcs_basic; 109 109 ] ); 110 110 ( "combinators", 111 111 [ 112 - Alcotest.test_case "default unchanged" `Quick test_default_unchanged; 113 - Alcotest.test_case "default ours" `Quick test_default_ours_changed; 114 - Alcotest.test_case "default theirs" `Quick test_default_theirs_changed; 115 - Alcotest.test_case "default conflict" `Quick test_default_conflict; 116 - Alcotest.test_case "default both same" `Quick test_default_both_same; 112 + Alcotest.test_case "default unchanged" `Quick default_unchanged; 113 + Alcotest.test_case "default ours" `Quick default_ours_changed; 114 + Alcotest.test_case "default theirs" `Quick default_theirs_changed; 115 + Alcotest.test_case "default conflict" `Quick default_conflict; 116 + Alcotest.test_case "default both same" `Quick default_both_same; 117 117 ] ); 118 118 ( "merge", 119 119 [ 120 - Alcotest.test_case "no conflicts" `Quick test_has_conflicts_clean; 121 - Alcotest.test_case "has conflicts" `Quick test_has_conflicts_dirty; 120 + Alcotest.test_case "no conflicts" `Quick has_conflicts_clean; 121 + Alcotest.test_case "has conflicts" `Quick has_conflicts_dirty; 122 122 ] ); 123 123 ]