fork of go-gitdiff with jj support
1package gitdiff
2
3import (
4 "strings"
5 "testing"
6)
7
8func TestTextFragmentValidate(t *testing.T) {
9 tests := map[string]struct {
10 Fragment TextFragment
11 Err string
12 }{
13 "oldLines": {
14 Fragment: TextFragment{
15 OldPosition: 1,
16 OldLines: 3,
17 NewPosition: 1,
18 NewLines: 2,
19 LeadingContext: 1,
20 TrailingContext: 0,
21 LinesAdded: 1,
22 LinesDeleted: 1,
23 Lines: []Line{
24 {Op: OpContext, Line: "line 1\n"},
25 {Op: OpDelete, Line: "old line 2\n"},
26 {Op: OpAdd, Line: "new line 2\n"},
27 },
28 },
29 Err: "2 old lines",
30 },
31 "newLines": {
32 Fragment: TextFragment{
33 OldPosition: 1,
34 OldLines: 2,
35 NewPosition: 1,
36 NewLines: 3,
37 LeadingContext: 1,
38 TrailingContext: 0,
39 LinesAdded: 1,
40 LinesDeleted: 1,
41 Lines: []Line{
42 {Op: OpContext, Line: "line 1\n"},
43 {Op: OpDelete, Line: "old line 2\n"},
44 {Op: OpAdd, Line: "new line 2\n"},
45 },
46 },
47 Err: "2 new lines",
48 },
49 "leadingContext": {
50 Fragment: TextFragment{
51 OldPosition: 1,
52 OldLines: 2,
53 NewPosition: 1,
54 NewLines: 2,
55 LeadingContext: 0,
56 TrailingContext: 0,
57 LinesAdded: 1,
58 LinesDeleted: 1,
59 Lines: []Line{
60 {Op: OpContext, Line: "line 1\n"},
61 {Op: OpDelete, Line: "old line 2\n"},
62 {Op: OpAdd, Line: "new line 2\n"},
63 },
64 },
65 Err: "1 leading context lines",
66 },
67 "trailingContext": {
68 Fragment: TextFragment{
69 OldPosition: 1,
70 OldLines: 4,
71 NewPosition: 1,
72 NewLines: 3,
73 LeadingContext: 1,
74 TrailingContext: 1,
75 LinesAdded: 1,
76 LinesDeleted: 2,
77 Lines: []Line{
78 {Op: OpContext, Line: "line 1\n"},
79 {Op: OpDelete, Line: "old line 2\n"},
80 {Op: OpAdd, Line: "new line 2\n"},
81 {Op: OpContext, Line: "line 3\n"},
82 {Op: OpDelete, Line: "old line 4\n"},
83 },
84 },
85 Err: "0 trailing context lines",
86 },
87 "linesAdded": {
88 Fragment: TextFragment{
89 OldPosition: 1,
90 OldLines: 4,
91 NewPosition: 1,
92 NewLines: 3,
93 LeadingContext: 1,
94 TrailingContext: 0,
95 LinesAdded: 2,
96 LinesDeleted: 2,
97 Lines: []Line{
98 {Op: OpContext, Line: "line 1\n"},
99 {Op: OpDelete, Line: "old line 2\n"},
100 {Op: OpAdd, Line: "new line 2\n"},
101 {Op: OpContext, Line: "line 3\n"},
102 {Op: OpDelete, Line: "old line 4\n"},
103 },
104 },
105 Err: "1 added lines",
106 },
107 "linesDeleted": {
108 Fragment: TextFragment{
109 OldPosition: 1,
110 OldLines: 4,
111 NewPosition: 1,
112 NewLines: 3,
113 LeadingContext: 1,
114 TrailingContext: 0,
115 LinesAdded: 1,
116 LinesDeleted: 1,
117 Lines: []Line{
118 {Op: OpContext, Line: "line 1\n"},
119 {Op: OpDelete, Line: "old line 2\n"},
120 {Op: OpAdd, Line: "new line 2\n"},
121 {Op: OpContext, Line: "line 3\n"},
122 {Op: OpDelete, Line: "old line 4\n"},
123 },
124 },
125 Err: "2 deleted lines",
126 },
127 "fileCreation": {
128 Fragment: TextFragment{
129 OldPosition: 0,
130 OldLines: 2,
131 NewPosition: 1,
132 NewLines: 1,
133 LeadingContext: 0,
134 TrailingContext: 0,
135 LinesAdded: 1,
136 LinesDeleted: 2,
137 Lines: []Line{
138 {Op: OpDelete, Line: "old line 1\n"},
139 {Op: OpDelete, Line: "old line 2\n"},
140 {Op: OpAdd, Line: "new line\n"},
141 },
142 },
143 Err: "creation fragment",
144 },
145 }
146
147 for name, test := range tests {
148 t.Run(name, func(t *testing.T) {
149 err := test.Fragment.Validate()
150 if test.Err == "" && err != nil {
151 t.Fatalf("unexpected validation error: %v", err)
152 }
153 if test.Err != "" && err == nil {
154 t.Fatal("expected validation error, but got nil")
155 }
156 if !strings.Contains(err.Error(), test.Err) {
157 t.Fatalf("incorrect validation error: %q is not in %q", test.Err, err.Error())
158 }
159 })
160 }
161}