You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

csv_test.go 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package gitdiff
  5. import (
  6. "encoding/csv"
  7. "strings"
  8. "testing"
  9. csv_module "code.gitea.io/gitea/modules/csv"
  10. "code.gitea.io/gitea/modules/setting"
  11. "github.com/stretchr/testify/assert"
  12. )
  13. func TestCSVDiff(t *testing.T) {
  14. var cases = []struct {
  15. diff string
  16. base string
  17. head string
  18. cells [][2]TableDiffCellType
  19. }{
  20. // case 0
  21. {
  22. diff: `diff --git a/unittest.csv b/unittest.csv
  23. --- a/unittest.csv
  24. +++ b/unittest.csv
  25. @@ -0,0 +1,2 @@
  26. +col1,col2
  27. +a,a`,
  28. base: "",
  29. head: "col1,col2\na,a",
  30. cells: [][2]TableDiffCellType{{TableDiffCellAdd, TableDiffCellAdd}, {TableDiffCellAdd, TableDiffCellAdd}},
  31. },
  32. // case 1
  33. {
  34. diff: `diff --git a/unittest.csv b/unittest.csv
  35. --- a/unittest.csv
  36. +++ b/unittest.csv
  37. @@ -1,2 +1,3 @@
  38. col1,col2
  39. -a,a
  40. +a,a
  41. +b,b`,
  42. base: "col1,col2\na,a",
  43. head: "col1,col2\na,a\nb,b",
  44. cells: [][2]TableDiffCellType{{TableDiffCellEqual, TableDiffCellEqual}, {TableDiffCellEqual, TableDiffCellEqual}, {TableDiffCellAdd, TableDiffCellAdd}},
  45. },
  46. // case 2
  47. {
  48. diff: `diff --git a/unittest.csv b/unittest.csv
  49. --- a/unittest.csv
  50. +++ b/unittest.csv
  51. @@ -1,3 +1,2 @@
  52. col1,col2
  53. -a,a
  54. b,b`,
  55. base: "col1,col2\na,a\nb,b",
  56. head: "col1,col2\nb,b",
  57. cells: [][2]TableDiffCellType{{TableDiffCellEqual, TableDiffCellEqual}, {TableDiffCellDel, TableDiffCellDel}, {TableDiffCellEqual, TableDiffCellEqual}},
  58. },
  59. // case 3
  60. {
  61. diff: `diff --git a/unittest.csv b/unittest.csv
  62. --- a/unittest.csv
  63. +++ b/unittest.csv
  64. @@ -1,2 +1,2 @@
  65. col1,col2
  66. -b,b
  67. +b,c`,
  68. base: "col1,col2\nb,b",
  69. head: "col1,col2\nb,c",
  70. cells: [][2]TableDiffCellType{{TableDiffCellEqual, TableDiffCellEqual}, {TableDiffCellEqual, TableDiffCellChanged}},
  71. },
  72. // case 4
  73. {
  74. diff: `diff --git a/unittest.csv b/unittest.csv
  75. --- a/unittest.csv
  76. +++ b/unittest.csv
  77. @@ -1,2 +0,0 @@
  78. -col1,col2
  79. -b,c`,
  80. base: "col1,col2\nb,c",
  81. head: "",
  82. cells: [][2]TableDiffCellType{{TableDiffCellDel, TableDiffCellDel}, {TableDiffCellDel, TableDiffCellDel}},
  83. },
  84. }
  85. for n, c := range cases {
  86. diff, err := ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, strings.NewReader(c.diff))
  87. if err != nil {
  88. t.Errorf("ParsePatch failed: %s", err)
  89. }
  90. var baseReader *csv.Reader
  91. if len(c.base) > 0 {
  92. baseReader, err = csv_module.CreateReaderAndGuessDelimiter(strings.NewReader(c.base))
  93. if err != nil {
  94. t.Errorf("CreateReaderAndGuessDelimiter failed: %s", err)
  95. }
  96. }
  97. var headReader *csv.Reader
  98. if len(c.head) > 0 {
  99. headReader, err = csv_module.CreateReaderAndGuessDelimiter(strings.NewReader(c.head))
  100. if err != nil {
  101. t.Errorf("CreateReaderAndGuessDelimiter failed: %s", err)
  102. }
  103. }
  104. result, err := CreateCsvDiff(diff.Files[0], baseReader, headReader)
  105. assert.NoError(t, err)
  106. assert.Len(t, result, 1, "case %d: should be one section", n)
  107. section := result[0]
  108. assert.Len(t, section.Rows, len(c.cells), "case %d: should be %d rows", n, len(c.cells))
  109. for i, row := range section.Rows {
  110. assert.Len(t, row.Cells, 2, "case %d: row %d should have two cells", n, i)
  111. for j, cell := range row.Cells {
  112. assert.Equal(t, c.cells[i][j], cell.Type, "case %d: row %d cell %d should be equal", n, i, j)
  113. }
  114. }
  115. }
  116. }