1:
2:
3:
4:
5: (use gauche.test)
6: (test-start "treemap")
7:
8:
9: (let1 tree1 #f
10: (test* "make-tree-map" #t
11: (begin (set! tree1 (make-tree-map = <))
12: (tree-map? tree1)))
13: (test* "tree-map-get" *test-error*
14: (tree-map-get #f 0 'foo))
15: (test* "tree-map-get" 'not-found
16: (tree-map-get tree1 0 'not-found))
17: (test* "tree-map-get" *test-error*
18: (tree-map-get tree1 0))
19: (test* "tree-map-put!" *test-error*
20: (tree-map-put! #f 0 'foo))
21: (test* "tree-map-put!" "0"
22: (begin (tree-map-put! tree1 0 "0")
23: (tree-map-get tree1 0)))
24: (test* "tree-map-put!" '("0" "1")
25: (begin (tree-map-put! tree1 1 "1")
26: (list (tree-map-get tree1 0)
27: (tree-map-get tree1 1))))
28: (test* "tree-map-put!" 'bar
29: (begin (tree-map-put! tree1 2 'foo)
30: (tree-map-put! tree1 2 'bar)
31: (tree-map-get tree1 2)))
32: '(test* "tree-map-check" #t
33: (tree-map-check tree1))
34: (test* "tree-map-fold" '(2 bar 1 "1" 0 "0")
35: (tree-map-fold tree1 list* '()))
36: (test* "tree-map-fold-right" '(0 "0" 1 "1" 2 bar)
37: (tree-map-fold-right tree1 list* '()))
38: (test* "tree-map-delete! (exiting key)" '(#t not-found)
39: (let1 r (tree-map-delete! tree1 1)
40: (list r (tree-map-get tree1 1 'not-found))))
41: (test* "tree-map-delete! (non-existing key)" #f
42: (tree-map-delete! tree1 1))
43: (test* "tree-map-delete!" 'no-error
44: (begin (tree-map-delete! tree1 1)
45: 'no-error))
46: (test* "tree-map->alist" '()
47: (tree-map->alist (make-tree-map = <)))
48: (test* "tree-map->alist" '((0 . "0") (1 . "1") (2 . "2"))
49: (let1 tree (make-tree-map = <)
50: (for-each (lambda (p) (tree-map-put! tree (car p) (cdr p)))
51: '((0 . "0") (1 . "1") (2 . "2")))
52: (tree-map->alist tree)))
53: (test* "alist->tree-map" '((0 . "0") (1 . "1") (2 . "2"))
54: (tree-map->alist
55: (alist->tree-map '((0 . "0") (1 . "1") (2 . "2")) = <)))
56: (test* "tree-map-empty?" #f
57: (tree-map-empty? tree1))
58: (test* "tree-map-empty?" #t
59: (tree-map-empty? (make-tree-map = <)))
60: (test* "tree-map-empty?" *test-error*
61: (tree-map-empty? 'wrong-arg))
62: (test* "tree-map-exists?" '(#t #f)
63: (let1 tree (make-tree-map = <)
64: (tree-map-put! tree 1 'foo)
65: (map (cut tree-map-exists? tree <>)
66: '(1 2))))
67: (test* "tree-map-num-entries" '(0 1 0)
68: (let* ((t (make-tree-map = <))
69: (a (tree-map-num-entries t))
70: (b (begin (tree-map-put! t 7 7)
71: (tree-map-num-entries t)))
72: (c (begin (tree-map-delete! t 7)
73: (tree-map-num-entries t))))
74: (list a b c)))
75: (test* "tree-map-push!" '(bar foo)
76: (let1 tree (make-tree-map = <)
77: (tree-map-push! tree 1 'foo)
78: (tree-map-push! tree 1 'bar)
79: (tree-map-get tree 1)))
80: (test* "tree-map-pop!" '(foo bar)
81: (let1 tree (alist->tree-map '((1 foo bar)) = <)
82: (let1 r (tree-map-pop! tree 1)
83: (list r (tree-map-pop! tree 1)))))
84: (test* "tree-map-update!" 2
85: (let1 tree (make-tree-map = <)
86: (tree-map-update! tree 1 (cut + 1 <>) 0)
87: (tree-map-update! tree 1 (cut + 1 <>) 0)
88: (tree-map-get tree 1)))
89: )
90:
91:
92: (let ((empty (make-tree-map = <))
93: (tree2 (alist->tree-map '((1 . "1") (0 . "0") (2 . "2")) = <)))
94:
95: (test* "tree-map-min" '(0 . "0") (tree-map-min tree2))
96: (test* "tree-map-max" '(2 . "2") (tree-map-max tree2))
97: (test* "tree-map-min" *test-error* (tree-map-min 'wrong-arg))
98: (test* "tree-map-max" *test-error* (tree-map-max 'wrong-arg))
99:
100: (test* "tree-map-keys" '(0 1 2)
101: (tree-map-keys tree2))
102:
103: (test* "tree-map-values" '("0" "1" "2")
104: (tree-map-values tree2))
105:
106: (test* "tree-map-copy" #t
107: (let1 new (tree-map-copy tree2)
108: (%tree-map-check-consistency new)
109: (equal? (tree-map->alist tree2)
110: (tree-map->alist new))))
111:
112: (test* "tree-map-pop-min!" '((0 . "0") (1 . "1"))
113: (let1 r (tree-map-pop-min! tree2)
114: (list r (tree-map-min tree2))))
115:
116: (test* "tree-map-pop-max!" '((2 . "2") (1 . "1"))
117: (let1 r (tree-map-pop-max! tree2)
118: (list r (tree-map-max tree2))))
119: )
120:
121:
122:
123:
124:
125:
126: (let1 tree (make-tree-map = <)
127: (define (i . args) (dolist (k args) (tree-map-put! tree k k)))
128: (define (d . args) (dolist (k args) (tree-map-delete! tree k)))
129: (define (c) (%tree-map-check-consistency tree))
130:
131:
132:
133:
134: (test* "insertion case 0" #t (begin (i 0) (c)))
135:
136:
137:
138:
139: (test* "insetrion case 2" #t (begin (i 1) (c)))
140:
141:
142:
143:
144:
145:
146:
147: (test* "insertion case 3&1" #t (begin (i -1 -2 2) (c)))
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159: (test* "insertion case 5b" #t (begin (i 1.5) (c)))
160:
161:
162:
163:
164:
165:
166:
167:
168:
169: (test* "insertion case 5a" #t (begin (i -1.5) (c)))
170:
171:
172:
173:
174:
175:
176:
177:
178:
179: (test* "deletion case 1" #t (begin (d 2) (c)))
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191: (i 2 3 -2 -3)
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203: (test* "deletion case 8a" #t (begin (d 1) (c)))
204:
205:
206:
207:
208:
209:
210:
211:
212:
213: (test* "deletion case8b" #t (begin (d -1) (c)))
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227: (test* "deletion case6" #t (begin (d 2) (c)))
228:
229:
230:
231:
232:
233:
234:
235: (test* "deletion case2" #t (begin (d 1.5) (c)))
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249: (i 2 1 .5 2.5 3.5 4)
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263: (test* "deletion case5" #t (begin (d -3) (c)))
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278: (i -0.5 -1)
279:
280:
281:
282:
283:
284: (test* "deletion case7a" #t (begin (d -2) (c)))
285:
286:
287: (test* "deletion case4b" #t (begin (d 0.5 1) (c)))
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298: (test* "deletion case3" #t (begin (d 2 -1) (c)))
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310: (d 3.5 3 -1.5)
311: (i -1 -2 -3 -4 -0.7)
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324: (test* "insertion case4a" #t (begin (i -0.6) (c)))
325:
326:
327:
328:
329:
330:
331:
332:
333: (d 2.5 4 -3 -4)
334:
335:
336:
337:
338:
339:
340:
341: (test* "deletion case4a" #t (begin (d -2) (c)))
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353: (d -0.7)
354: (i -2 2 1 3 -0.3)
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367: (test* "insertion case4b" #t (begin (i -0.4) (c)))
368: )
369:
370:
371: (test-end)
372: