@@ -19,14 +19,15 @@ type mapEntry struct {
19
19
20
20
type validatedMap struct {
21
21
impl * Map
22
- expected map [int ]int
23
- deleted map [mapEntry ]struct {}
24
- seen map [mapEntry ]struct {}
22
+ expected map [int ]int // current key-value mapping.
23
+ deleted map [mapEntry ]int // maps deleted entries to their clock time of last deletion
24
+ seen map [mapEntry ]int // maps seen entries to their clock time of last insertion
25
+ clock int
25
26
}
26
27
27
28
func TestSimpleMap (t * testing.T ) {
28
- deletedEntries := make (map [mapEntry ]struct {} )
29
- seenEntries := make (map [mapEntry ]struct {} )
29
+ deletedEntries := make (map [mapEntry ]int )
30
+ seenEntries := make (map [mapEntry ]int )
30
31
31
32
m1 := & validatedMap {
32
33
impl : NewMap (func (a , b interface {}) bool {
@@ -43,7 +44,7 @@ func TestSimpleMap(t *testing.T) {
43
44
validateRef (t , m1 , m3 )
44
45
m3 .destroy ()
45
46
46
- assertSameMap (t , deletedEntries , map [mapEntry ]struct {}{
47
+ assertSameMap (t , entrySet ( deletedEntries ) , map [mapEntry ]struct {}{
47
48
{key : 8 , value : 8 }: {},
48
49
})
49
50
@@ -59,7 +60,7 @@ func TestSimpleMap(t *testing.T) {
59
60
m1 .set (t , 6 , 6 )
60
61
validateRef (t , m1 )
61
62
62
- assertSameMap (t , deletedEntries , map [mapEntry ]struct {}{
63
+ assertSameMap (t , entrySet ( deletedEntries ) , map [mapEntry ]struct {}{
63
64
{key : 2 , value : 2 }: {},
64
65
{key : 8 , value : 8 }: {},
65
66
})
@@ -98,7 +99,7 @@ func TestSimpleMap(t *testing.T) {
98
99
99
100
m1 .destroy ()
100
101
101
- assertSameMap (t , deletedEntries , map [mapEntry ]struct {}{
102
+ assertSameMap (t , entrySet ( deletedEntries ) , map [mapEntry ]struct {}{
102
103
{key : 2 , value : 2 }: {},
103
104
{key : 6 , value : 60 }: {},
104
105
{key : 8 , value : 8 }: {},
@@ -114,12 +115,12 @@ func TestSimpleMap(t *testing.T) {
114
115
115
116
m2 .destroy ()
116
117
117
- assertSameMap (t , seenEntries , deletedEntries )
118
+ assertSameMap (t , entrySet ( seenEntries ), entrySet ( deletedEntries ) )
118
119
}
119
120
120
121
func TestRandomMap (t * testing.T ) {
121
- deletedEntries := make (map [mapEntry ]struct {} )
122
- seenEntries := make (map [mapEntry ]struct {} )
122
+ deletedEntries := make (map [mapEntry ]int )
123
+ seenEntries := make (map [mapEntry ]int )
123
124
124
125
m := & validatedMap {
125
126
impl : NewMap (func (a , b interface {}) bool {
@@ -132,7 +133,7 @@ func TestRandomMap(t *testing.T) {
132
133
133
134
keys := make ([]int , 0 , 1000 )
134
135
for i := 0 ; i < 1000 ; i ++ {
135
- key := rand .Int ( )
136
+ key := rand .Intn ( 10000 )
136
137
m .set (t , key , key )
137
138
keys = append (keys , key )
138
139
@@ -148,12 +149,20 @@ func TestRandomMap(t *testing.T) {
148
149
}
149
150
150
151
m .destroy ()
151
- assertSameMap (t , seenEntries , deletedEntries )
152
+ assertSameMap (t , entrySet (seenEntries ), entrySet (deletedEntries ))
153
+ }
154
+
155
+ func entrySet (m map [mapEntry ]int ) map [mapEntry ]struct {} {
156
+ set := make (map [mapEntry ]struct {})
157
+ for k := range m {
158
+ set [k ] = struct {}{}
159
+ }
160
+ return set
152
161
}
153
162
154
163
func TestUpdate (t * testing.T ) {
155
- deletedEntries := make (map [mapEntry ]struct {} )
156
- seenEntries := make (map [mapEntry ]struct {} )
164
+ deletedEntries := make (map [mapEntry ]int )
165
+ seenEntries := make (map [mapEntry ]int )
157
166
158
167
m1 := & validatedMap {
159
168
impl : NewMap (func (a , b interface {}) bool {
@@ -173,15 +182,7 @@ func TestUpdate(t *testing.T) {
173
182
174
183
m1 .destroy ()
175
184
m2 .destroy ()
176
- assertSameMap (t , seenEntries , deletedEntries )
177
- }
178
-
179
- func (vm * validatedMap ) onDelete (t * testing.T , key , value int ) {
180
- entry := mapEntry {key : key , value : value }
181
- if _ , ok := vm .deleted [entry ]; ok {
182
- t .Fatalf ("tried to delete entry twice, key: %d, value: %d" , key , value )
183
- }
184
- vm .deleted [entry ] = struct {}{}
185
+ assertSameMap (t , entrySet (seenEntries ), entrySet (deletedEntries ))
185
186
}
186
187
187
188
func validateRef (t * testing.T , maps ... * validatedMap ) {
@@ -234,9 +235,12 @@ func (vm *validatedMap) validate(t *testing.T) {
234
235
235
236
validateNode (t , vm .impl .root , vm .impl .less )
236
237
238
+ // Note: this validation may not make sense if maps were constructed using
239
+ // SetAll operations. If this proves to be problematic, remove the clock,
240
+ // deleted, and seen fields.
237
241
for key , value := range vm .expected {
238
242
entry := mapEntry {key : key , value : value }
239
- if _ , ok := vm .deleted [entry ]; ok {
243
+ if deleteAt := vm .deleted [entry ]; deleteAt > vm . seen [ entry ] {
240
244
t .Fatalf ("entry is deleted prematurely, key: %d, value: %d" , key , value )
241
245
}
242
246
}
@@ -281,19 +285,27 @@ func validateNode(t *testing.T, node *mapNode, less func(a, b interface{}) bool)
281
285
282
286
func (vm * validatedMap ) setAll (t * testing.T , other * validatedMap ) {
283
287
vm .impl .SetAll (other .impl )
288
+
289
+ // Note: this is buggy because we are not updating vm.clock, vm.deleted, or
290
+ // vm.seen.
284
291
for key , value := range other .expected {
285
292
vm .expected [key ] = value
286
293
}
287
294
vm .validate (t )
288
295
}
289
296
290
297
func (vm * validatedMap ) set (t * testing.T , key , value int ) {
291
- vm .seen [mapEntry {key : key , value : value }] = struct {}{}
298
+ entry := mapEntry {key : key , value : value }
299
+
300
+ vm .clock ++
301
+ vm .seen [entry ] = vm .clock
302
+
292
303
vm .impl .Set (key , value , func (deletedKey , deletedValue interface {}) {
293
304
if deletedKey != key || deletedValue != value {
294
305
t .Fatalf ("unexpected passed in deleted entry: %v/%v, expected: %v/%v" , deletedKey , deletedValue , key , value )
295
306
}
296
- vm .onDelete (t , key , value )
307
+ // Not safe if closure shared between two validatedMaps.
308
+ vm .deleted [entry ] = vm .clock
297
309
})
298
310
vm .expected [key ] = value
299
311
vm .validate (t )
@@ -305,6 +317,7 @@ func (vm *validatedMap) set(t *testing.T, key, value int) {
305
317
}
306
318
307
319
func (vm * validatedMap ) remove (t * testing.T , key int ) {
320
+ vm .clock ++
308
321
vm .impl .Delete (key )
309
322
delete (vm .expected , key )
310
323
vm .validate (t )
0 commit comments