From 5ae4543ce1e337c5a9b6631289555f7697a5cc5d Mon Sep 17 00:00:00 2001
From: Farhan Sajid <farhansajid7861@gmail.com>
Date: Sat, 4 Sep 2021 19:15:58 -0400
Subject: [PATCH 1/2] add array

---
 diff.go | 2 ++
 1 file changed, 2 insertions(+)

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):

From 186e089311df61350565577c57958509585ecd8c Mon Sep 17 00:00:00 2001
From: Farhan Sajid <farhansajid7861@gmail.com>
Date: Sun, 5 Sep 2021 03:50:57 -0400
Subject: [PATCH 2/2] add more tests

---
 diff_test.go | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 123 insertions(+)

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{