diff_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package diff
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/require"
  5. )
  6. func TestGenerateDiff(t *testing.T) {
  7. t.Parallel()
  8. before := "package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"Hello, World!\")\n\tfmt.Println(\"Line 2\")\n}\n"
  9. after := "package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"Hello, Go!\")\n\tfmt.Println(\"Line 2\")\n}\n"
  10. t.Run("LF_before_LF_after", func(t *testing.T) {
  11. t.Parallel()
  12. diff, additions, removals := GenerateDiff(before, after, "main.go")
  13. require.Equal(t, 1, additions)
  14. require.Equal(t, 1, removals)
  15. require.Contains(t, diff, "-\tfmt.Println(\"Hello, World!\")")
  16. require.Contains(t, diff, "+\tfmt.Println(\"Hello, Go!\")")
  17. })
  18. t.Run("CRLF_before_LF_after", func(t *testing.T) {
  19. t.Parallel()
  20. crlfBefore := "package main\r\n\r\nimport \"fmt\"\r\n\r\nfunc main() {\r\n\tfmt.Println(\"Hello, World!\")\r\n\tfmt.Println(\"Line 2\")\r\n}\r\n"
  21. diff, additions, removals := GenerateDiff(crlfBefore, after, "main.go")
  22. require.Equal(t, 1, additions, "CRLF before should not inflate counts")
  23. require.Equal(t, 1, removals, "CRLF before should not inflate counts")
  24. require.Contains(t, diff, "-\tfmt.Println(\"Hello, World!\")")
  25. require.Contains(t, diff, "+\tfmt.Println(\"Hello, Go!\")")
  26. })
  27. t.Run("LF_before_CRLF_after", func(t *testing.T) {
  28. t.Parallel()
  29. crlfAfter := "package main\r\n\r\nimport \"fmt\"\r\n\r\nfunc main() {\r\n\tfmt.Println(\"Hello, Go!\")\r\n\tfmt.Println(\"Line 2\")\r\n}\r\n"
  30. diff, additions, removals := GenerateDiff(before, crlfAfter, "main.go")
  31. require.Equal(t, 1, additions, "CRLF after should not inflate counts")
  32. require.Equal(t, 1, removals, "CRLF after should not inflate counts")
  33. require.Contains(t, diff, "-\tfmt.Println(\"Hello, World!\")")
  34. require.Contains(t, diff, "+\tfmt.Println(\"Hello, Go!\")")
  35. })
  36. t.Run("CRLF_before_CRLF_after", func(t *testing.T) {
  37. t.Parallel()
  38. crlfBefore := "package main\r\n\r\nimport \"fmt\"\r\n\r\nfunc main() {\r\n\tfmt.Println(\"Hello, World!\")\r\n\tfmt.Println(\"Line 2\")\r\n}\r\n"
  39. crlfAfter := "package main\r\n\r\nimport \"fmt\"\r\n\r\nfunc main() {\r\n\tfmt.Println(\"Hello, Go!\")\r\n\tfmt.Println(\"Line 2\")\r\n}\r\n"
  40. diff, additions, removals := GenerateDiff(crlfBefore, crlfAfter, "main.go")
  41. require.Equal(t, 1, additions)
  42. require.Equal(t, 1, removals)
  43. require.Contains(t, diff, "-\tfmt.Println(\"Hello, World!\")")
  44. require.Contains(t, diff, "+\tfmt.Println(\"Hello, Go!\")")
  45. })
  46. t.Run("mixed_line_endings", func(t *testing.T) {
  47. t.Parallel()
  48. mixedBefore := "line1\r\nline2\nline3\r\nline4\n"
  49. mixedAfter := "line1\nline2\nchanged\nline4\n"
  50. diff, additions, removals := GenerateDiff(mixedBefore, mixedAfter, "test.txt")
  51. require.Equal(t, 1, additions)
  52. require.Equal(t, 1, removals)
  53. require.Contains(t, diff, "-line3")
  54. require.Contains(t, diff, "+changed")
  55. })
  56. t.Run("identical_content_different_endings", func(t *testing.T) {
  57. t.Parallel()
  58. lfContent := "line1\nline2\nline3\n"
  59. crlfContent := "line1\r\nline2\r\nline3\r\n"
  60. diff, additions, removals := GenerateDiff(lfContent, crlfContent, "test.txt")
  61. require.Equal(t, 0, additions, "identical content with different line endings should produce no diff")
  62. require.Equal(t, 0, removals, "identical content with different line endings should produce no diff")
  63. require.Empty(t, diff)
  64. })
  65. t.Run("tabs_are_not_normalized", func(t *testing.T) {
  66. t.Parallel()
  67. tabContent := "\tfoo\n"
  68. spaceContent := " foo\n"
  69. diff, additions, removals := GenerateDiff(tabContent, spaceContent, "test.txt")
  70. require.Equal(t, 1, additions, "tab vs space should be a real diff")
  71. require.Equal(t, 1, removals, "tab vs space should be a real diff")
  72. require.NotEmpty(t, diff)
  73. })
  74. t.Run("empty_before", func(t *testing.T) {
  75. t.Parallel()
  76. diff, additions, removals := GenerateDiff("", "line1\nline2\n", "new.txt")
  77. require.Equal(t, 2, additions)
  78. require.Equal(t, 0, removals)
  79. require.Contains(t, diff, "+line1")
  80. require.Contains(t, diff, "+line2")
  81. })
  82. t.Run("empty_after", func(t *testing.T) {
  83. t.Parallel()
  84. diff, additions, removals := GenerateDiff("line1\nline2\n", "", "deleted.txt")
  85. require.Equal(t, 0, additions)
  86. require.Equal(t, 2, removals)
  87. require.Contains(t, diff, "-line1")
  88. require.Contains(t, diff, "-line2")
  89. })
  90. t.Run("leading_slash_trimmed", func(t *testing.T) {
  91. t.Parallel()
  92. diff, _, _ := GenerateDiff("a\n", "b\n", "/src/main.go")
  93. require.Contains(t, diff, "a/src/main.go")
  94. require.Contains(t, diff, "b/src/main.go")
  95. require.NotContains(t, diff, "a//src/main.go")
  96. })
  97. }