#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