diff --git a/diff.go b/diff.go index fe0b415..e57abd3 100644 --- a/diff.go +++ b/diff.go @@ -166,6 +166,8 @@ func (d *Differ) diff(path []string, a, b reflect.Value, parent interface{}) err return d.diffStruct(path, a, b) case are(a, b, reflect.Slice, reflect.Invalid): return d.diffSlice(path, a, b) + case are(a, b, reflect.Array, reflect.Invalid): + return d.diffSlice(path, a, b) case are(a, b, reflect.String, reflect.Invalid): return d.diffString(path, a, b, parent) case are(a, b, reflect.Bool, reflect.Invalid): diff --git a/diff_test.go b/diff_test.go index a0427c2..6a9b76a 100644 --- a/diff_test.go +++ b/diff_test.go @@ -98,6 +98,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "uint-array-insert", [3]uint{1, 2, 3}, [4]uint{1, 2, 3, 4}, + Changelog{ + Change{Type: CREATE, Path: []string{"3"}, To: uint(4)}, + }, + nil, + }, { "int-slice-insert", []int{1, 2, 3}, []int{1, 2, 3, 4}, Changelog{ @@ -105,6 +112,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "int-array-insert", [3]int{1, 2, 3}, [4]int{1, 2, 3, 4}, + Changelog{ + Change{Type: CREATE, Path: []string{"3"}, To: 4}, + }, + nil, + }, { "uint-slice-delete", []uint{1, 2, 3}, []uint{1, 3}, Changelog{ @@ -112,6 +126,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "uint-array-delete", [3]uint{1, 2, 3}, [2]uint{1, 3}, + Changelog{ + Change{Type: DELETE, Path: []string{"1"}, From: uint(2)}, + }, + nil, + }, { "int-slice-delete", []int{1, 2, 3}, []int{1, 3}, Changelog{ @@ -127,6 +148,14 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "uint-slice-array-delete", [3]uint{1, 2, 3}, [3]uint{1, 3, 4}, + Changelog{ + Change{Type: DELETE, Path: []string{"1"}, From: uint(2)}, + Change{Type: CREATE, Path: []string{"2"}, To: uint(4)}, + }, + nil, + }, { "int-slice-insert-delete", []int{1, 2, 3}, []int{1, 3, 4}, Changelog{ @@ -142,6 +171,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "string-array-insert", [3]string{"1", "2", "3"}, [4]string{"1", "2", "3", "4"}, + Changelog{ + Change{Type: CREATE, Path: []string{"3"}, To: "4"}, + }, + nil, + }, { "string-slice-delete", []string{"1", "2", "3"}, []string{"1", "3"}, Changelog{ @@ -149,6 +185,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "string-slice-delete", [3]string{"1", "2", "3"}, [2]string{"1", "3"}, + Changelog{ + Change{Type: DELETE, Path: []string{"1"}, From: "2"}, + }, + nil, + }, { "string-slice-insert-delete", []string{"1", "2", "3"}, []string{"1", "3", "4"}, Changelog{ @@ -157,6 +200,14 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "string-array-insert-delete", [3]string{"1", "2", "3"}, [3]string{"1", "3", "4"}, + Changelog{ + Change{Type: DELETE, Path: []string{"1"}, From: "2"}, + Change{Type: CREATE, Path: []string{"2"}, To: "4"}, + }, + nil, + }, { "comparable-slice-insert", []tistruct{{"one", 1}}, []tistruct{{"one", 1}, {"two", 2}}, Changelog{ @@ -165,6 +216,14 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "comparable-array-insert", [1]tistruct{{"one", 1}}, [2]tistruct{{"one", 1}, {"two", 2}}, + Changelog{ + Change{Type: CREATE, Path: []string{"two", "name"}, To: "two"}, + Change{Type: CREATE, Path: []string{"two", "value"}, To: 2}, + }, + nil, + }, { "comparable-slice-delete", []tistruct{{"one", 1}, {"two", 2}}, []tistruct{{"one", 1}}, Changelog{ @@ -173,6 +232,14 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "comparable-array-delete", [2]tistruct{{"one", 1}, {"two", 2}}, [1]tistruct{{"one", 1}}, + Changelog{ + Change{Type: DELETE, Path: []string{"two", "name"}, From: "two"}, + Change{Type: DELETE, Path: []string{"two", "value"}, From: 2}, + }, + nil, + }, { "comparable-slice-update", []tistruct{{"one", 1}}, []tistruct{{"one", 50}}, Changelog{ @@ -180,6 +247,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "comparable-array-update", [1]tistruct{{"one", 1}}, [1]tistruct{{"one", 50}}, + Changelog{ + Change{Type: UPDATE, Path: []string{"one", "value"}, From: 1, To: 50}, + }, + nil, + }, { "map-slice-insert", []map[string]string{{"test": "123"}}, []map[string]string{{"test": "123", "tset": "456"}}, Changelog{ @@ -187,6 +261,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "map-array-insert", [1]map[string]string{{"test": "123"}}, [1]map[string]string{{"test": "123", "tset": "456"}}, + Changelog{ + Change{Type: CREATE, Path: []string{"0", "tset"}, To: "456"}, + }, + nil, + }, { "map-slice-update", []map[string]string{{"test": "123"}}, []map[string]string{{"test": "456"}}, Changelog{ @@ -194,6 +275,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "map-array-update", [1]map[string]string{{"test": "123"}}, [1]map[string]string{{"test": "456"}}, + Changelog{ + Change{Type: UPDATE, Path: []string{"0", "test"}, From: "123", To: "456"}, + }, + nil, + }, { "map-slice-delete", []map[string]string{{"test": "123", "tset": "456"}}, []map[string]string{{"test": "123"}}, Changelog{ @@ -201,6 +289,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "map-array-delete", [1]map[string]string{{"test": "123", "tset": "456"}}, [1]map[string]string{{"test": "123"}}, + Changelog{ + Change{Type: DELETE, Path: []string{"0", "tset"}, From: "456"}, + }, + nil, + }, { "map-interface-slice-update", []map[string]interface{}{{"test": nil}}, []map[string]interface{}{{"test": "456"}}, Changelog{ @@ -208,6 +303,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "map-interface-array-update", [1]map[string]interface{}{{"test": nil}}, [1]map[string]interface{}{{"test": "456"}}, + Changelog{ + Change{Type: UPDATE, Path: []string{"0", "test"}, From: nil, To: "456"}, + }, + nil, + }, { "map-nil", map[string]string{"one": "test"}, nil, Changelog{ @@ -257,6 +359,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "nested-array-insert", map[string][3]int{"a": {1, 2, 3}}, map[string][4]int{"a": {1, 2, 3, 4}}, + Changelog{ + Change{Type: CREATE, Path: []string{"a", "3"}, To: 4}, + }, + nil, + }, { "nested-slice-update", map[string][]int{"a": {1, 2, 3}}, map[string][]int{"a": {1, 4, 3}}, Changelog{ @@ -264,6 +373,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "nested-array-update", map[string][3]int{"a": {1, 2, 3}}, map[string][3]int{"a": {1, 4, 3}}, + Changelog{ + Change{Type: UPDATE, Path: []string{"a", "1"}, From: 2, To: 4}, + }, + nil, + }, { "nested-slice-delete", map[string][]int{"a": {1, 2, 3}}, map[string][]int{"a": {1, 3}}, Changelog{ @@ -271,6 +387,13 @@ func TestDiff(t *testing.T) { }, nil, }, + { + "nested-array-delete", map[string][3]int{"a": {1, 2, 3}}, map[string][2]int{"a": {1, 3}}, + Changelog{ + Change{Type: DELETE, Path: []string{"a", "1"}, From: 2, To: nil}, + }, + nil, + }, { "struct-string-update", tstruct{Name: "one"}, tstruct{Name: "two"}, Changelog{