diff_test.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package pretty
  2. import (
  3. "testing"
  4. )
  5. type difftest struct {
  6. a interface{}
  7. b interface{}
  8. exp []string
  9. }
  10. type S struct {
  11. A int
  12. S *S
  13. I interface{}
  14. C []int
  15. }
  16. var diffs = []difftest{
  17. {a: nil, b: nil},
  18. {a: S{A: 1}, b: S{A: 1}},
  19. {0, "", []string{`int != string`}},
  20. {0, 1, []string{`0 != 1`}},
  21. {S{}, new(S), []string{`pretty.S != *pretty.S`}},
  22. {"a", "b", []string{`"a" != "b"`}},
  23. {S{}, S{A: 1}, []string{`A: 0 != 1`}},
  24. {new(S), &S{A: 1}, []string{`A: 0 != 1`}},
  25. {S{S: new(S)}, S{S: &S{A: 1}}, []string{`S.A: 0 != 1`}},
  26. {S{}, S{I: 0}, []string{`I: nil != 0`}},
  27. {S{I: 1}, S{I: "x"}, []string{`I: int != string`}},
  28. {S{}, S{C: []int{1}}, []string{`C: []int[0] != []int[1]`}},
  29. {S{C: []int{}}, S{C: []int{1}}, []string{`C: []int[0] != []int[1]`}},
  30. {S{C: []int{1, 2, 3}}, S{C: []int{1, 2, 4}}, []string{`C[2]: 3 != 4`}},
  31. {S{}, S{A: 1, S: new(S)}, []string{`A: 0 != 1`, `S: nil != &{0 <nil> <nil> []}`}},
  32. }
  33. func TestDiff(t *testing.T) {
  34. for _, tt := range diffs {
  35. got := Diff(tt.a, tt.b)
  36. eq := len(got) == len(tt.exp)
  37. if eq {
  38. for i := range got {
  39. eq = eq && got[i] == tt.exp[i]
  40. }
  41. }
  42. if !eq {
  43. t.Errorf("diffing % #v", tt.a)
  44. t.Errorf("with % #v", tt.b)
  45. diffdiff(t, got, tt.exp)
  46. continue
  47. }
  48. }
  49. }
  50. func diffdiff(t *testing.T, got, exp []string) {
  51. minus(t, "unexpected:", got, exp)
  52. minus(t, "missing:", exp, got)
  53. }
  54. func minus(t *testing.T, s string, a, b []string) {
  55. var i, j int
  56. for i = 0; i < len(a); i++ {
  57. for j = 0; j < len(b); j++ {
  58. if a[i] == b[j] {
  59. break
  60. }
  61. }
  62. if j == len(b) {
  63. t.Error(s, a[i])
  64. }
  65. }
  66. }