more tests and cases and documentation
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
#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)
|
||||
@@ -0,0 +1,99 @@
|
||||
#lang racket/base
|
||||
|
||||
(require "../main.rkt"
|
||||
"jsmaker-executors.rkt"
|
||||
"jsmaker-test-framework.rkt")
|
||||
|
||||
(define tests
|
||||
(list
|
||||
(js-expression-test 'list-literal
|
||||
(js/expression (list 1 2 3))
|
||||
"[1,2,3]")
|
||||
(js-expression-test 'cons-front
|
||||
(js/expression (cons 1 (list 2 3)))
|
||||
"[1,2,3]")
|
||||
(js-expression-test 'list-star-with-tail
|
||||
(js/expression (list* 1 2 (list 3 4)))
|
||||
"[1,2,3,4]")
|
||||
(js-expression-test 'append-no-args
|
||||
(js/expression (append))
|
||||
"[]")
|
||||
(js-expression-test 'append-many
|
||||
(js/expression (append (list 1) (list 2 3) (list) (list 4)))
|
||||
"[1,2,3,4]")
|
||||
(js-expression-test 'car-cdr-cadr-caddr
|
||||
(js/expression (list (car (list 10 20 30))
|
||||
(cdr (list 10 20 30))
|
||||
(cadr (list 10 20 30))
|
||||
(caddr (list 10 20 30))))
|
||||
"[10,[20,30],20,30]")
|
||||
(js-expression-test 'length-and-predicates
|
||||
(js/expression (list (length (list 1 2 3))
|
||||
(null? (list))
|
||||
(empty? (list 1))
|
||||
(pair? (list 1))
|
||||
(list? (list 1 2))))
|
||||
"[3,true,false,true,true]")
|
||||
(js-expression-test 'list-ref-tail-last
|
||||
(js/expression (list (list-ref (list "a" "b" "c") 1)
|
||||
(list-tail (list 1 2 3 4) 2)
|
||||
(last (list 1 2 3 4))))
|
||||
"[\"b\",[3,4],4]")
|
||||
(js-expression-test 'take-drop-left-right
|
||||
(js/expression (list (take (list 1 2 3 4 5) 3)
|
||||
(drop (list 1 2 3 4 5) 2)
|
||||
(take-right (list 1 2 3 4 5) 2)
|
||||
(drop-right (list 1 2 3 4 5) 2)))
|
||||
"[[1,2,3],[3,4,5],[4,5],[1,2,3]]")
|
||||
(js-expression-test 'reverse-list
|
||||
(js/expression (reverse (list 1 2 3)))
|
||||
"[3,2,1]")
|
||||
(js-expression-test 'map-single-list
|
||||
(js/expression (map (lambda (x) (* x x)) (list 1 2 3 4)))
|
||||
"[1,4,9,16]")
|
||||
(js-expression-test 'map-multiple-lists
|
||||
(js/expression (map (lambda (x y) (+ x y))
|
||||
(list 1 2 3)
|
||||
(list 10 20 30)))
|
||||
"[11,22,33]")
|
||||
(js-expression-test 'filter-racket-truthiness
|
||||
(js/expression (filter (lambda (x) x) (list #f 0 "" 3)))
|
||||
"[0,\"\",3]")
|
||||
(js-expression-test 'filter-predicate
|
||||
(js/expression (filter (lambda (x) (> x 2)) (list 1 2 3 4)))
|
||||
"[3,4]")
|
||||
(js-expression-test 'foldl-cons
|
||||
(js/expression (foldl (lambda (x acc) (cons x acc)) (list) (list 1 2 3)))
|
||||
"[3,2,1]")
|
||||
(js-expression-test 'foldr-cons
|
||||
(js/expression (foldr (lambda (x acc) (cons x acc)) (list) (list 1 2 3)))
|
||||
"[1,2,3]")
|
||||
(js-expression-test 'member-tail-and-false
|
||||
(js/expression (list (member 2 (list 1 2 3 2))
|
||||
(member 9 (list 1 2 3))))
|
||||
"[[2,3,2],false]")
|
||||
(js-expression-test 'remove-first
|
||||
(js/expression (remove 2 (list 1 2 3 2)))
|
||||
"[1,3,2]")
|
||||
(js-expression-test 'remove-star
|
||||
(js/expression (remove* (list 2 4) (list 1 2 3 4 2 5)))
|
||||
"[1,3,5]")
|
||||
(js-expression-test 'list-set-update-immutable
|
||||
(js/expression (let* ([xs (list 1 2 3)]
|
||||
[ys (list-set xs 1 20)]
|
||||
[zs (list-update xs 2 (lambda (x) (+ x 100)))])
|
||||
(list xs ys zs)))
|
||||
"[[1,2,3],[1,20,3],[1,2,103]]")
|
||||
(js-expression-test 'sort-with-predicate
|
||||
(js/expression (sort (list 5 1 4 2 3) (lambda (a b) (< a b))))
|
||||
"[1,2,3,4,5]")
|
||||
(js-expression-test 'list-composition-pipeline
|
||||
(js/expression
|
||||
(let* ([xs (append (list 1 2) (list 3 4 5))]
|
||||
[ys (filter (lambda (x) (odd? x)) xs)]
|
||||
[zs (map (lambda (x) (* x 10)) ys)])
|
||||
(take zs 2)))
|
||||
"[10,30]")))
|
||||
|
||||
(define engine (find-js-engine))
|
||||
(run-jsmaker-regression 'jsmaker-list-regression tests "/tmp/jsmaker-list-regression.js" #:engine engine)
|
||||
@@ -4,4 +4,6 @@
|
||||
"jsmaker-regexp-regression.rkt"
|
||||
"jsmaker-program-regression.rkt"
|
||||
"jsmaker-dom-exercises.rkt"
|
||||
"jsmaker-usecases.rkt")
|
||||
"jsmaker-usecases.rkt"
|
||||
"jsmaker-list-regression.rkt"
|
||||
"jsmaker-hash-regression.rkt")
|
||||
|
||||
Reference in New Issue
Block a user