code.gitea.io/gitea@v1.21.7/services/gitdiff/csv_test.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package gitdiff 5 6 import ( 7 "encoding/csv" 8 "strings" 9 "testing" 10 11 csv_module "code.gitea.io/gitea/modules/csv" 12 "code.gitea.io/gitea/modules/setting" 13 14 "github.com/stretchr/testify/assert" 15 ) 16 17 func TestCSVDiff(t *testing.T) { 18 cases := []struct { 19 diff string 20 base string 21 head string 22 cells [][]TableDiffCellType 23 }{ 24 // case 0 - initial commit of a csv 25 { 26 diff: `diff --git a/unittest.csv b/unittest.csv 27 --- a/unittest.csv 28 +++ b/unittest.csv 29 @@ -0,0 +1,2 @@ 30 +col1,col2 31 +a,a`, 32 base: "", 33 head: `col1,col2 34 a,a`, 35 cells: [][]TableDiffCellType{ 36 {TableDiffCellAdd, TableDiffCellAdd}, 37 {TableDiffCellAdd, TableDiffCellAdd}, 38 }, 39 }, 40 // case 1 - adding 1 row at end 41 { 42 diff: `diff --git a/unittest.csv b/unittest.csv 43 --- a/unittest.csv 44 +++ b/unittest.csv 45 @@ -1,2 +1,3 @@ 46 col1,col2 47 -a,a 48 +a,a 49 +b,b`, 50 base: `col1,col2 51 a,a`, 52 head: `col1,col2 53 a,a 54 b,b`, 55 cells: [][]TableDiffCellType{ 56 {TableDiffCellUnchanged, TableDiffCellUnchanged}, 57 {TableDiffCellUnchanged, TableDiffCellUnchanged}, 58 {TableDiffCellAdd, TableDiffCellAdd}, 59 }, 60 }, 61 // case 2 - row deleted 62 { 63 diff: `diff --git a/unittest.csv b/unittest.csv 64 --- a/unittest.csv 65 +++ b/unittest.csv 66 @@ -1,3 +1,2 @@ 67 col1,col2 68 -a,a 69 b,b`, 70 base: `col1,col2 71 a,a 72 b,b`, 73 head: `col1,col2 74 b,b`, 75 cells: [][]TableDiffCellType{ 76 {TableDiffCellUnchanged, TableDiffCellUnchanged}, 77 {TableDiffCellDel, TableDiffCellDel}, 78 {TableDiffCellUnchanged, TableDiffCellUnchanged}, 79 }, 80 }, 81 // case 3 - row changed 82 { 83 diff: `diff --git a/unittest.csv b/unittest.csv 84 --- a/unittest.csv 85 +++ b/unittest.csv 86 @@ -1,2 +1,2 @@ 87 col1,col2 88 -b,b 89 +b,c`, 90 base: `col1,col2 91 b,b`, 92 head: `col1,col2 93 b,c`, 94 cells: [][]TableDiffCellType{ 95 {TableDiffCellUnchanged, TableDiffCellUnchanged}, 96 {TableDiffCellUnchanged, TableDiffCellChanged}, 97 }, 98 }, 99 // case 4 - all deleted 100 { 101 diff: `diff --git a/unittest.csv b/unittest.csv 102 --- a/unittest.csv 103 +++ b/unittest.csv 104 @@ -1,2 +0,0 @@ 105 -col1,col2 106 -b,c`, 107 base: `col1,col2 108 b,c`, 109 head: "", 110 cells: [][]TableDiffCellType{ 111 {TableDiffCellDel, TableDiffCellDel}, 112 {TableDiffCellDel, TableDiffCellDel}, 113 }, 114 }, 115 // case 5 - renames first column 116 { 117 diff: `diff --git a/unittest.csv b/unittest.csv 118 --- a/unittest.csv 119 +++ b/unittest.csv 120 @@ -1,3 +1,3 @@ 121 -col1,col2,col3 122 +cola,col2,col3 123 a,b,c`, 124 base: `col1,col2,col3 125 a,b,c`, 126 head: `cola,col2,col3 127 a,b,c`, 128 cells: [][]TableDiffCellType{ 129 {TableDiffCellDel, TableDiffCellAdd, TableDiffCellUnchanged, TableDiffCellUnchanged}, 130 {TableDiffCellDel, TableDiffCellAdd, TableDiffCellUnchanged, TableDiffCellUnchanged}, 131 }, 132 }, 133 // case 6 - inserts a column after first, deletes last column 134 { 135 diff: `diff --git a/unittest.csv b/unittest.csv 136 --- a/unittest.csv 137 +++ b/unittest.csv 138 @@ -1,2 +1,2 @@ 139 -col1,col2,col3 140 -a,b,c 141 +col1,col1a,col2 142 +a,d,b`, 143 base: `col1,col2,col3 144 a,b,c`, 145 head: `col1,col1a,col2 146 a,d,b`, 147 cells: [][]TableDiffCellType{ 148 {TableDiffCellUnchanged, TableDiffCellAdd, TableDiffCellDel, TableDiffCellMovedUnchanged}, 149 {TableDiffCellUnchanged, TableDiffCellAdd, TableDiffCellDel, TableDiffCellMovedUnchanged}, 150 }, 151 }, 152 // case 7 - deletes first column, inserts column after last 153 { 154 diff: `diff --git a/unittest.csv b/unittest.csv 155 --- a/unittest.csv 156 +++ b/unittest.csv 157 @@ -1,2 +1,2 @@ 158 -col1,col2,col3 159 -a,b,c 160 +col2,col3,col4 161 +b,c,d`, 162 base: `col1,col2,col3 163 a,b,c`, 164 head: `col2,col3,col4 165 b,c,d`, 166 cells: [][]TableDiffCellType{ 167 {TableDiffCellDel, TableDiffCellUnchanged, TableDiffCellUnchanged, TableDiffCellAdd}, 168 {TableDiffCellDel, TableDiffCellUnchanged, TableDiffCellUnchanged, TableDiffCellAdd}, 169 }, 170 }, 171 // case 8 - two columns deleted, 2 added 172 { 173 diff: `diff --git a/unittest.csv b/unittest.csv 174 --- a/unittest.csv 175 +++ b/unittest.csv 176 @@ -1,2 +1,2 @@ 177 -col1,col2,col 178 -a,b,c 179 +col3,col4,col5 180 +c,d,e`, 181 base: `col1,col2,col3 182 a,b,c`, 183 head: `col3,col4,col5 184 c,d,e`, 185 cells: [][]TableDiffCellType{ 186 {TableDiffCellDel, TableDiffCellMovedUnchanged, TableDiffCellDel, TableDiffCellAdd, TableDiffCellAdd}, 187 {TableDiffCellDel, TableDiffCellMovedUnchanged, TableDiffCellDel, TableDiffCellAdd, TableDiffCellAdd}, 188 }, 189 }, 190 } 191 192 for n, c := range cases { 193 diff, err := ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, strings.NewReader(c.diff), "") 194 if err != nil { 195 t.Errorf("ParsePatch failed: %s", err) 196 } 197 198 var baseReader *csv.Reader 199 if len(c.base) > 0 { 200 baseReader, err = csv_module.CreateReaderAndDetermineDelimiter(nil, strings.NewReader(c.base)) 201 if err != nil { 202 t.Errorf("CreateReaderAndDetermineDelimiter failed: %s", err) 203 } 204 } 205 var headReader *csv.Reader 206 if len(c.head) > 0 { 207 headReader, err = csv_module.CreateReaderAndDetermineDelimiter(nil, strings.NewReader(c.head)) 208 if err != nil { 209 t.Errorf("CreateReaderAndDetermineDelimiter failed: %s", err) 210 } 211 } 212 213 result, err := CreateCsvDiff(diff.Files[0], baseReader, headReader) 214 assert.NoError(t, err) 215 assert.Len(t, result, 1, "case %d: should be one section", n) 216 217 section := result[0] 218 assert.Len(t, section.Rows, len(c.cells), "case %d: should be %d rows", n, len(c.cells)) 219 220 for i, row := range section.Rows { 221 assert.Len(t, row.Cells, len(c.cells[i]), "case %d: row %d should have %d cells", n, i, len(c.cells[i])) 222 for j, cell := range row.Cells { 223 assert.Equal(t, c.cells[i][j], cell.Type, "case %d: row %d cell %d should be equal", n, i, j) 224 } 225 } 226 } 227 }