aboutsummaryrefslogtreecommitdiffstats
path: root/lib/csc/hash-map-test.csc
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2022-08-01 19:35:19 -0700
committerRose Hogenson <rhogenson@posteo.net>2022-08-01 19:35:19 -0700
commitacc561366f3fe6ec0377103f52ef0f7e923711c9 (patch)
treed7a19cfbad78a69ebea71b27302e708c0655863d /lib/csc/hash-map-test.csc
parent99ce19a8053a93457885f32ec54c1c5b7c1961c1 (diff)
downloadchromatopelma-acc561366f3fe6ec0377103f52ef0f7e923711c9.tar.zst
Modify the project structure.
Now the lib directory contains what will eventually end up on the user's /usr/lib/csc. When I write make install, it will copy all of the .csc files from lib into the destination lib directory. This means I can start working on the standard library in lib/scheme.
Diffstat (limited to 'lib/csc/hash-map-test.csc')
-rw-r--r--lib/csc/hash-map-test.csc155
1 files changed, 155 insertions, 0 deletions
diff --git a/lib/csc/hash-map-test.csc b/lib/csc/hash-map-test.csc
new file mode 100644
index 0000000..6f83c30
--- /dev/null
+++ b/lib/csc/hash-map-test.csc
@@ -0,0 +1,155 @@
+(define-library (csc hash-map-test)
+ (import (scheme base)
+ (only (csc format)
+ sprintf)
+ (only (csc loop)
+ loop
+ return)
+ (only (csc sort) sort)
+ (only (csc testing)
+ assert-equal
+ assert-raises
+ test)
+ (csc hash-map))
+ (begin
+
+
+ (define transform-map
+ (list
+ (cons map? map->alist)
+ (cons list? (lambda (l) (sort (lambda (x y) (string<? (symbol->string (car x)) (symbol->string (car y)))) l)))))
+
+
+ (test alist->map-singleton
+ (assert-equal
+ '((a . 1))
+ (alist->map compare-symbols '((a . 1)))
+ transform-map))
+
+
+ (test alist->map-two
+ (assert-equal
+ '((a . 1) (b . 2))
+ (alist->map compare-symbols '((a . 1) (b . 2)))
+ transform-map))
+
+
+ (test alist->map-longer
+ (assert-equal
+ '((a . 1) (b . 2) (c . 3) (d . 4) (e . 5) (f . 6))
+ (alist->map compare-symbols '((a . 1) (b . 2) (c . 3) (d . 4) (e . 5) (f . 6)))
+ transform-map))
+
+
+ (test alist->map-larger
+ (assert-equal
+ '((f . 5) (m . 1) (n . 7) (q . 3) (x . 8))
+ (alist->map compare-symbols '((m . 1) (n . 2) (q . 3) (f . 5) (n . 7) (x . 8)))
+ transform-map))
+
+
+ (test alist->map-in-order
+ (assert-equal
+ '((a . ()) (b . ()) (c . ()) (d . ()) (e . ()) (f . ()) (g . ()) (h . ()))
+ (alist->map compare-symbols '((a . ()) (b . ()) (c . ()) (d . ()) (e . ()) (f . ()) (g . ()) (h . ())))
+ transform-map))
+
+
+ (test alist->map-reversed
+ (assert-equal
+ '((h . ()) (g . ()) (f . ()) (e . ()) (d . ()) (c . ()) (b . ()) (a . ()))
+ (alist->map compare-symbols '((a . ()) (b . ()) (c . ()) (d . ()) (e . ()) (f . ()) (g . ()) (h . ())))
+ transform-map))
+
+
+ (test alist->map-overwrite
+ (assert-equal
+ '((a . 2))
+ (alist->map compare-symbols '((a . 1) (a . 2)))
+ transform-map))
+
+
+ (test alist->map-alternating
+ (assert-equal
+ '((h . ()) (g . ()) (i . ()) (f . ()) (j . ()) (e . ()) (k . ()) (d . ()) (l . ()) (c . ()))
+ (alist->map compare-symbols '((c . ()) (d . ()) (e . ()) (f . ()) (g . ()) (h . ()) (i . ()) (j . ()) (k . ()) (l . ())))
+ transform-map))
+
+
+ (define (test-map . bindings)
+ (alist->map compare-symbols bindings))
+
+
+ (test lookup
+ (assert-equal
+ 2
+ (lookup (test-map '(a . 1) '(b . 2) '(c . 3)) 'b)))
+
+
+ (test lookup-notfound
+ (assert-raises key-not-found-error?
+ (lookup (test-map '(a . 1) '(b . 2) '(c . 3)) 'd)))
+
+
+ (test lookup-default
+ (assert-equal
+ #f
+ (lookup (test-map '(a . #t) '(b . #t)) 'c #f)))
+
+
+ (test merge
+ (assert-equal
+ '((a . 1) (b . 2) (c . 3) (d . 4))
+ (merge
+ (test-map '(a . 1) '(b . 2))
+ (test-map '(c . 3) '(d . 4)))
+ transform-map))
+
+
+ (test delete
+ (assert-equal
+ '((a . 1) (b . 2) (d . 4))
+ (delete
+ (test-map '(a . 1) '(b . 2) '(c . 3) '(d . 4))
+ 'c)
+ transform-map))
+
+
+ (test delete-only
+ (assert-equal
+ '()
+ (delete
+ (test-map '(a . 1))
+ 'a)
+ transform-map))
+
+
+ (test delete-first
+ (assert-equal
+ '((b . 2) (c . 3) (d . 4))
+ (delete
+ (test-map '(a . 1) '(b . 2) '(c . 3) '(d . 4))
+ 'a)
+ transform-map))
+
+
+ (test delete-last
+ (assert-equal
+ '((a . 1) (b . 2) (c . 3))
+ (delete
+ (test-map '(a . 1) '(b . 2) '(c . 3) '(d . 4))
+ 'd)
+ transform-map))
+
+
+ (test delete-many
+ (assert-equal
+ '()
+ (loop with m = (loop with m = (test-map)
+ for i from 1 to 100
+ do (set! m (insert m (string->symbol (sprintf "key{}" i)) i))
+ finally (return m))
+ for i from 1 to 100
+ do (set! m (delete m (string->symbol (sprintf "key{}" i))))
+ finally (return m))
+ transform-map))))