;;;; tests for mdh (import mdh test) (test-begin) (test "^ ref undefined" "" (^ "empty")) (set! (^ "foo") 123) (test "^ get" "123" (^ "foo")) (set! (^ "array" 1 2 3) 'hello) (test "^ get indexed " "hello" (^ "array" 1 2 3)) (define g1 (global "g1")) (define go1 (global-object g1)) (define ga1 (g1 1 2 3)) (test "global-reference" #t (global-reference? ga1)) (test "global-object" go1 (global-object ga1)) (test "global-object 2" go1 (global-object g1)) (test "idempotent global-object" go1 (global-object go1)) (test "global undefined" "" (global-ref go1)) (test "name" "g1" (global-name go1)) (global-set! go1 "one") (test "global get" "one" (global-ref go1)) (test "predicate" #t (global? go1)) (global-set! g1 "two") (test "global set" "two" (global-ref (g1))) (global-set! ga1 99) (global-set! (g1 1 2 4) 100) (test "global get indexed" "99" (global-ref ga1)) (test "global get indexed 2" "99" (global-ref (g1 1 2 3))) (test "global get indexed 3" "100" (global-ref (g1 1 2 4))) (test "data (undefined)" #f (^data "none")) (test "data (leaf)" 'leaf (global-data ga1)) (test "data (leaf) 2" 'leaf (^data 'g1 1 2 3)) (test "data (empty)" 'empty (global-data (g1 1 2))) (global-set! (g1 1) 'x) (test "data (branch)" 'branch (global-data (g1 1))) (test "order 1" "1" (global-next go1)) (test "order 2" "4" (global-next ga1)) (test "order 3" "" (global-next (g1 1))) (test "order 3.5" "2" (global-next (g1 1 ""))) (test "order 4" "3" (global-previous (g1 1 2 4))) (test "order 5" "1" (^next 'g1)) (test "order 6" "4" (^next 'g1 1 2 3)) (test "order 7" "3" (^previous 'g1 1 2 4)) (define g2 (global "g2")) (global-set! (g2 2 3) 'end) (global-merge (g1 2) g2) (test "merged" "end" (global-ref (g1 2 2 3))) (global-kill (g1 1)) (test "kill" #f (global-data ga1)) ;; further tests, suggested by "kluk": ;; tests ported from mdh manual section 9.1.3.16 Order() ;; https://www.cs.uni.edu/~okane/source/MUMPS-MDH/MDH.pdf page 31 ;; given: (set! (^ "o" 1) "") (set! (^ "o" 1 10) "") (set! (^ "o" 1 20) "") (set! (^ "o" 5 1) "") (set! (^ "o" 5 2) "") ; mdh manual misprinted the 2 as a 5: test("5","5") =""; ;; Then Order() will return the following values: (set! go (global "o")) (test "order ex 1" "1" (global-next (go ""))) ; test().Order(1) yields "1" (test "order ex 2" "10" (global-next (go 1 ""))) ; test("1","").Order(1) yields "10" (test "order ex 3" "20" (global-next (go 1 10))) ; test("1","10").Order(1) yields 20 (test "order ex 4" "" (global-next (go 1 20))) ; test("1","20").Order(1) yields "" (empty string) (test "order ex 5" "5" (global-next (go 1))) ; test("1").Order(1) yields "5" (test "order ex 6" "1" (global-next (go 5 ""))) ; test("5","").Order(1) yields "1" (test "order ex 7" "2" (global-next (go 5 1))) ; test("5","1").Order(1) yields "2" (test "order ex 8" "" (global-next (go 5 2))) ; test("5","2").Order(1) yields "" (empty string) (test "order ex 9" "" (global-next (go 5))) ; test("5").Order(1) yields "" (empty string) (global-free g2) (test-error "use after free" (global-ref (g2))) (close-globals) (test-error "access after close" (global-ref (g1))) (test-end) (test-exit)