-
Notifications
You must be signed in to change notification settings - Fork 0
/
deep_copy_test.go
106 lines (94 loc) · 2.65 KB
/
deep_copy_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package object
import (
"testing"
"time"
"github.com/stretchr/testify/require"
)
type mapKey struct {
SomePublic int
SomeSecret int `secret:""`
}
type testType struct {
SomeSlice []testType
SomeMap map[mapKey]testType
SomePublicString string
SomeSecretString string `secret:""`
SomePointer *testType
SomeError error
SomeSecretSliceOfAny []any `secret:""`
SomeSecretMap map[int]testType `secret:""`
SomeTime time.Time
unexpectedField string
}
func TestNilInterface(t *testing.T) {
require.Equal(t, error(nil), DeepCopy(error(nil)))
}
func TestInfiniteRecursion(t *testing.T) {
s := &testType{
SomePublicString: "1",
}
s.SomePointer = s
require.Equal(t, s, DeepCopy(s))
}
func testSample() *testType {
return &testType{
SomeSlice: nil,
SomeMap: map[mapKey]testType{
{1, 2}: {
SomePublicString: "hello",
SomeSecretString: "bye",
},
},
SomePublicString: "public secret",
SomeSecretString: "secret secret",
SomePointer: &testType{
SomeSlice: []testType{{
SomePublicString: "false == false",
SomeSecretString: "but sometimes it does not",
SomePointer: &testType{},
}},
SomePublicString: "true == true",
SomeSecretString: "but there is a nuance",
},
SomeSecretSliceOfAny: []any{"random secrets"},
SomeSecretMap: map[int]testType{1: {}},
SomeTime: time.Date(1, 2, 3, 4, 5, 6, 7, time.UTC),
unexpectedField: "unexpected data",
}
}
func testSampleWithoutSecrets() *testType {
return &testType{
SomeSlice: nil,
SomeMap: map[mapKey]testType{
{1, 2}: {
SomePublicString: "hello",
},
},
SomePublicString: "public secret",
SomePointer: &testType{
SomeSlice: []testType{{
SomePublicString: "false == false",
SomePointer: &testType{},
}},
SomePublicString: "true == true",
},
SomeTime: time.Date(1, 2, 3, 4, 5, 6, 7, time.UTC),
unexpectedField: "unexpected data",
}
}
func TestComplexStructure(t *testing.T) {
sample := testSample()
sample.SomeTime = time.Time{}
sample.unexpectedField = ""
require.Equal(t, sample, DeepCopy(sample))
sampleWithoutSecrets := testSampleWithoutSecrets()
sampleWithoutSecrets.SomeTime = time.Time{}
sampleWithoutSecrets.unexpectedField = ""
require.Equal(t, sampleWithoutSecrets, DeepCopyWithoutSecrets(sample))
}
func TestComplexStructureWithUnexported(t *testing.T) {
sample := testSample()
require.Equal(t, sample, DeepCopy(sample, OptionWithUnexported(true)))
sampleWithoutSecrets := testSampleWithoutSecrets()
require.Equal(t, sampleWithoutSecrets, DeepCopyWithoutSecrets(sample, OptionWithUnexported(true)))
}