messagediff_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package messagediff
  2. import (
  3. "testing"
  4. "time"
  5. )
  6. type testStruct struct {
  7. A, b int
  8. C []int
  9. D [3]int
  10. }
  11. type RecursiveStruct struct {
  12. Key int
  13. Child *RecursiveStruct
  14. }
  15. func newRecursiveStruct(key int) *RecursiveStruct {
  16. a := &RecursiveStruct{
  17. Key: key,
  18. }
  19. b := &RecursiveStruct{
  20. Key: key,
  21. Child: a,
  22. }
  23. a.Child = b
  24. return a
  25. }
  26. type testCase struct {
  27. a, b interface{}
  28. diff string
  29. equal bool
  30. }
  31. func checkTestCases(t *testing.T, testData []testCase) {
  32. for i, td := range testData {
  33. diff, equal := PrettyDiff(td.a, td.b)
  34. if diff != td.diff {
  35. t.Errorf("%d. PrettyDiff(%#v, %#v) diff = %#v; not %#v", i, td.a, td.b, diff, td.diff)
  36. }
  37. if equal != td.equal {
  38. t.Errorf("%d. PrettyDiff(%#v, %#v) equal = %#v; not %#v", i, td.a, td.b, equal, td.equal)
  39. }
  40. }
  41. }
  42. func TestPrettyDiff(t *testing.T) {
  43. testData := []testCase{
  44. {
  45. true,
  46. false,
  47. "modified: = false\n",
  48. false,
  49. },
  50. {
  51. true,
  52. 0,
  53. "modified: = 0\n",
  54. false,
  55. },
  56. {
  57. []int{0, 1, 2},
  58. []int{0, 1, 2, 3},
  59. "added: [3] = 3\n",
  60. false,
  61. },
  62. {
  63. []int{0, 1, 2, 3},
  64. []int{0, 1, 2},
  65. "removed: [3] = 3\n",
  66. false,
  67. },
  68. {
  69. []int{0},
  70. []int{1},
  71. "modified: [0] = 1\n",
  72. false,
  73. },
  74. {
  75. &[]int{0},
  76. &[]int{1},
  77. "modified: [0] = 1\n",
  78. false,
  79. },
  80. {
  81. map[string]int{"a": 1, "b": 2},
  82. map[string]int{"b": 4, "c": 3},
  83. "added: [\"c\"] = 3\nmodified: [\"b\"] = 4\nremoved: [\"a\"] = 1\n",
  84. false,
  85. },
  86. {
  87. testStruct{1, 2, []int{1}, [3]int{4, 5, 6}},
  88. testStruct{1, 3, []int{1, 2}, [3]int{4, 5, 6}},
  89. "added: .C[1] = 2\nmodified: .b = 3\n",
  90. false,
  91. },
  92. {
  93. nil,
  94. nil,
  95. "",
  96. true,
  97. },
  98. {
  99. &struct{}{},
  100. nil,
  101. "modified: = <nil>\n",
  102. false,
  103. },
  104. {
  105. nil,
  106. &struct{}{},
  107. "modified: = &struct {}{}\n",
  108. false,
  109. },
  110. {
  111. time.Time{},
  112. time.Time{},
  113. "",
  114. true,
  115. },
  116. {
  117. time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC),
  118. time.Time{},
  119. "modified: .loc = (*time.Location)(nil)\nmodified: .sec = 0\n",
  120. false,
  121. },
  122. }
  123. checkTestCases(t, testData)
  124. }
  125. func TestPrettyDiffRecursive(t *testing.T) {
  126. testData := []testCase{
  127. {
  128. newRecursiveStruct(1),
  129. newRecursiveStruct(1),
  130. "",
  131. true,
  132. },
  133. {
  134. newRecursiveStruct(1),
  135. newRecursiveStruct(2),
  136. "modified: .Child.Key = 2\nmodified: .Key = 2\n",
  137. false,
  138. },
  139. }
  140. checkTestCases(t, testData)
  141. }
  142. func TestPathString(t *testing.T) {
  143. testData := []struct {
  144. in Path
  145. want string
  146. }{{
  147. Path{StructField("test"), SliceIndex(1), MapKey{"blue"}, MapKey{12.3}},
  148. ".test[1][\"blue\"][12.3]",
  149. }}
  150. for i, td := range testData {
  151. if out := td.in.String(); out != td.want {
  152. t.Errorf("%d. %#v.String() = %#v; not %#v", i, td.in, out, td.want)
  153. }
  154. }
  155. }