Files
js-maker/testing/jsmaker-hash-regression.rkt
T

147 lines
6.9 KiB
Racket

#lang racket/base
(require "../main.rkt"
"jsmaker-executors.rkt"
"jsmaker-test-framework.rkt")
(define tests
(list
(js-expression-test 'hash-literal-ref-count
(js/expression
(let ([h (hash 'a 1 'b 2)])
(list (hash-ref h 'a)
(hash-ref h 'b)
(hash-count h)
(hash-empty? h)
(hash? h))))
"[1,2,2,false,true]")
(js-expression-test 'make-hash-from-assoc-list
(js/expression
(let ([h (make-hash (list (cons 'a 1)
(cons 'b 2)))])
(list (hash-ref h 'a)
(hash-ref h 'b))))
"[1,2]")
(js-expression-test 'make-hash-empty-and-set-bang
(js/expression
(let ([h (make-hash)])
(hash-set! h 'a 1)
(hash-set! h 'b 2)
(list (hash-ref h 'a)
(hash-ref h 'b)
(hash-count h))))
"[1,2,2]")
(js-expression-test 'hash-ref-default-value-and-thunk
(js/expression
(let ([h (hash 'a 1)])
(list (hash-ref h 'missing 42)
(hash-ref h 'other (lambda () 99)))))
"[42,99]")
(js-expression-test 'hash-has-key
(js/expression
(let ([h (hash 'a #f 'b 2)])
(list (hash-has-key? h 'a)
(hash-has-key? h 'c)
(hash-ref h 'a 'fallback))))
"[true,false,false]")
(js-expression-test 'hash-set-immutable-copy
(js/expression
(let* ([h (hash 'a 1)]
[h2 (hash-set h 'b 2)])
(list (hash-has-key? h 'b)
(hash-ref h2 'a)
(hash-ref h2 'b))))
"[false,1,2]")
(js-expression-test 'hash-remove-immutable-copy
(js/expression
(let* ([h (hash 'a 1 'b 2)]
[h2 (hash-remove h 'a)])
(list (hash-has-key? h 'a)
(hash-has-key? h2 'a)
(hash-ref h2 'b))))
"[true,false,2]")
(js-expression-test 'hash-remove-bang
(js/expression
(let ([h (make-hash (list (cons 'a 1)
(cons 'b 2)))])
(hash-remove! h 'a)
(list (hash-has-key? h 'a)
(hash-ref h 'b)
(hash-count h))))
"[false,2,1]")
(js-expression-test 'hash-update-immutable
(js/expression
(let* ([h (hash 'a 1)]
[h2 (hash-update h 'a (lambda (x) (+ x 10)))]
[h3 (hash-update h2 'b (lambda (x) (+ x 1)) 40)])
(list (hash-ref h 'a)
(hash-ref h2 'a)
(hash-ref h3 'b))))
"[1,11,41]")
(js-expression-test 'hash-update-bang
(js/expression
(let ([h (make-hash (list (cons 'a 1)))])
(hash-update! h 'a (lambda (x) (+ x 10)))
(hash-update! h 'b (lambda (x) (+ x 1)) 40)
(list (hash-ref h 'a)
(hash-ref h 'b))))
"[11,41]")
(js-expression-test 'hash-clear-and-clear-bang
(js/expression
(let* ([h (make-hash (list (cons 'a 1)
(cons 'b 2)))]
[h2 (hash-clear h)])
(hash-clear! h)
(list (hash-empty? h)
(hash-empty? h2))))
"[true,true]")
(js-expression-test 'hash-copy-and-copy-clear
(js/expression
(let* ([h (hash 'a 1)]
[h2 (hash-copy h)]
[h3 (hash-copy-clear h)])
(hash-set! h2 'b 2)
(list (hash-has-key? h 'b)
(hash-ref h2 'b)
(hash-empty? h3))))
"[false,2,true]")
(js-expression-test 'hash-keys-values-list
(js/expression
(let ([h (hash 'a 1 'b 2)])
(list (hash-keys h)
(hash-values h)
(hash->list h))))
"[[\"a\",\"b\"],[1,2],[[\"a\",1],[\"b\",2]]]" )
(js-expression-test 'hash-map
(js/expression
(let ([h (hash 'a 1 'b 2)])
(hash-map h (lambda (k v) (string-append k ":" (number->string v))))))
"[\"a:1\",\"b:2\"]")
(js-expression-test 'hash-for-each
(js/expression
(let ([h (hash 'a 1 'b 2)]
[out (list)])
(hash-for-each h (lambda (k v)
(set! out (append out (list (string-append k (number->string v)))))))
out))
"[\"a1\",\"b2\"]")
(js-expression-test 'hasheq-and-make-immutable-hash
(js/expression
(let* ([h (hasheq 'a 1 'b 2)]
[h2 (make-immutable-hash (list (cons 'c 3)))])
(list (hash-ref h 'a)
(hash-ref h2 'c))))
"[1,3]")
(js-expression-test 'hash-composition-pipeline
(js/expression
(let* ([h (make-hash)]
[xs (list 'a 'b 'a 'c 'b 'a)])
(for ([x xs])
(hash-update! h x (lambda (n) (+ n 1)) 0))
(sort (hash-map h (lambda (k v) (list k v)))
(lambda (a b) (string<? (car a) (car b))))))
"[[\"a\",3],[\"b\",2],[\"c\",1]]")))
(define engine (find-js-engine))
(run-jsmaker-regression 'jsmaker-hash-regression tests "/tmp/jsmaker-hash-regression.js" #:engine engine)