1359 lines
61 KiB
Racket
1359 lines
61 KiB
Racket
#lang racket/base
|
||
|
||
(require "private/drracket-test-util.rkt"
|
||
drracket/private/syncheck/local-member-names
|
||
string-constants/string-constant
|
||
tests/utils/gui
|
||
racket/path
|
||
racket/class
|
||
racket/list
|
||
racket/file
|
||
mred
|
||
framework
|
||
mrlib/text-string-style-desc
|
||
(for-syntax racket/base))
|
||
|
||
(provide main)
|
||
|
||
;; type str/ann = (list (union symbol string) symbol)
|
||
;; type test = (make-test string
|
||
;; (listof str/ann)
|
||
;; (listof (cons (list number number) (listof (list number number)))))
|
||
;; (listof (list number number) (listof string)))
|
||
(define-struct test (line input expected arrows tooltips) #:transparent)
|
||
(define-struct (dir-test test) () #:transparent)
|
||
|
||
(define-struct rename-test (line input pos old-name new-name output) #:transparent)
|
||
|
||
(define build-test/proc
|
||
(λ (line input expected [arrow-table '()] #:tooltips [tooltips #f])
|
||
(make-test line input expected arrow-table tooltips)))
|
||
|
||
(define-syntax (build-test stx)
|
||
(syntax-case stx ()
|
||
[(_ args ...)
|
||
(with-syntax ([line (syntax-line stx)])
|
||
#'(build-test/proc line args ...))]))
|
||
|
||
(define-syntax (build-rename-test stx)
|
||
(syntax-case stx ()
|
||
[(_ args ...)
|
||
(with-syntax ([line (syntax-line stx)])
|
||
#'(rename-test line args ...))]))
|
||
|
||
(define-syntax (build-dir-test stx)
|
||
(syntax-case stx ()
|
||
[(_ args ...)
|
||
(with-syntax ([line (syntax-line stx)])
|
||
;; #f is for the tooltip portion of the test, just skip 'em
|
||
#'(make-dir-test line args ... #f))]))
|
||
|
||
;; tests : (listof test)
|
||
(define tests
|
||
(list
|
||
(build-test "12345"
|
||
'(("12345" constant)))
|
||
(build-test "'abcdef"
|
||
'(("'" imported-syntax)
|
||
("abcdef" constant)))
|
||
(build-test "(define f 1)"
|
||
'(("(" default-color)
|
||
("define" imported-syntax)
|
||
(" " default-color)
|
||
("f" lexically-bound-variable)
|
||
(" " default-color)
|
||
("1" constant)
|
||
(")" default-color)))
|
||
(build-test "(lambda (x) x)"
|
||
'(("(" default-color)
|
||
("lambda" imported-syntax)
|
||
(" (" default-color)
|
||
("x" lexically-bound-variable)
|
||
(") " default-color)
|
||
("x" lexically-bound-variable)
|
||
(")" default-color))
|
||
(list '((9 10) (12 13)))
|
||
#:tooltips '((9 10 "1 bound occurrence")))
|
||
(build-test "(lambda x x)"
|
||
'(("(" default-color)
|
||
("lambda" imported-syntax)
|
||
(" " default-color)
|
||
("x" lexically-bound-variable)
|
||
(" " default-color)
|
||
("x" lexically-bound-variable)
|
||
(")" default-color))
|
||
(list '((8 9) (10 11))))
|
||
(build-test "(lambda (x . y) x y)"
|
||
'(("(" default-color)
|
||
("lambda" imported-syntax)
|
||
(" (" default-color)
|
||
("x" lexically-bound-variable)
|
||
(" . " default-color)
|
||
("y" lexically-bound-variable)
|
||
(") " default-color)
|
||
("x" lexically-bound-variable)
|
||
(" " default-color)
|
||
("y" lexically-bound-variable)
|
||
(")" default-color))
|
||
(list '((9 10) (16 17))
|
||
'((13 14) (18 19))))
|
||
|
||
(build-test "(case-lambda [(x) x])"
|
||
'(("(" default-color)
|
||
("case-lambda" imported-syntax)
|
||
(" [(" default-color)
|
||
("x" lexically-bound-variable)
|
||
(") " default-color)
|
||
("x" lexically-bound-variable)
|
||
("])" default-color))
|
||
(list '((15 16) (18 19))))
|
||
|
||
(build-test "(if 1 2 3)"
|
||
'(("(" default-color)
|
||
("if" imported-syntax)
|
||
(" " default-color)
|
||
("1" constant)
|
||
(" " default-color)
|
||
("2" constant)
|
||
(" " default-color)
|
||
("3" constant)
|
||
(")" default-color)))
|
||
(build-test "(if 1 2)"
|
||
'(("(" default-color)
|
||
("if" imported-syntax)
|
||
(" " default-color)
|
||
("1" constant)
|
||
(" " default-color)
|
||
("2" constant)
|
||
(")" default-color)))
|
||
|
||
(build-test "(begin 1 2)"
|
||
'(("(" default-color)
|
||
("begin" imported-syntax)
|
||
(" " default-color)
|
||
("1" constant)
|
||
(" " default-color)
|
||
("2" constant)
|
||
(")" default-color)))
|
||
(build-test "(begin0 1 2)"
|
||
'(("(" default-color)
|
||
("begin0" imported-syntax)
|
||
(" " default-color)
|
||
("1" constant)
|
||
(" " default-color)
|
||
("2" constant)
|
||
(")" default-color)))
|
||
(build-test "(let ([x x]) x)"
|
||
'(("(" default-color)
|
||
("let" imported-syntax)
|
||
(" ([" default-color)
|
||
("x" lexically-bound-variable)
|
||
(" " default-color)
|
||
("x" free-variable)
|
||
("]) " default-color)
|
||
("x" lexically-bound-variable)
|
||
(")" default-color))
|
||
(list '((7 8) (13 14))))
|
||
(build-test "(letrec ([x x]) x)"
|
||
'(("(" default-color)
|
||
("letrec" imported-syntax)
|
||
(" ([" default-color)
|
||
("x" lexically-bound-variable)
|
||
(" " default-color)
|
||
("x" lexically-bound-variable)
|
||
("]) " default-color)
|
||
("x" lexically-bound-variable)
|
||
(")" default-color))
|
||
(list '((10 11) (12 13) (16 17))))
|
||
(build-test "(#%top . x)"
|
||
'(("(" default-color)
|
||
("#%top" imported-syntax)
|
||
(" . " default-color)
|
||
("x" free-variable)
|
||
(")" default-color)))
|
||
(build-test "(set! x 1)"
|
||
'(("(" default-color)
|
||
("set!" imported-syntax)
|
||
(" " default-color)
|
||
("x" free-variable)
|
||
(" " default-color)
|
||
("1" constant)
|
||
(")" default-color)))
|
||
(build-test "(set! x 1) (define x 2)"
|
||
'(("(" default-color)
|
||
("set!" imported-syntax)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(" " default-color)
|
||
("1" constant)
|
||
(") (" default-color)
|
||
("define" imported-syntax)
|
||
(" " default-color)
|
||
("x" set!d) ;; top-level doesn't help here ....
|
||
(" 2)" default-color))
|
||
(list '((19 20) (6 7))))
|
||
(build-test "(let ([x 1]) (set! x 2))"
|
||
'(("(" default-color)
|
||
("let" imported-syntax)
|
||
(" ([" default-color)
|
||
("x" set!d)
|
||
(" " default-color)
|
||
("1" constant)
|
||
("]) (" default-color)
|
||
("set!" imported-syntax)
|
||
(" " default-color)
|
||
("x" set!d)
|
||
(" " default-color)
|
||
("2" constant)
|
||
("))" default-color))
|
||
(list '((7 8) (19 20)))
|
||
#:tooltips '((7 8 "1 bound occurrence")
|
||
(7 8 "set!’d variable")
|
||
(19 20 "set!’d variable")))
|
||
|
||
(build-test "object%"
|
||
'(("object%" imported-syntax))) ; used to be lexically-bound-variable
|
||
(build-test "unbound-id"
|
||
'(("unbound-id" free-variable)))
|
||
(build-test "(define bd 1) bd"
|
||
'(("(" default-color)
|
||
("define" imported-syntax)
|
||
(" " default-color)
|
||
("bd" lexically-bound-variable)
|
||
(" " default-color)
|
||
("1" constant)
|
||
(") " default-color)
|
||
("bd" lexically-bound-variable))
|
||
(list '((8 10) (14 16))))
|
||
(build-test "#'abc"
|
||
'(("#'" imported-syntax)
|
||
("abc" constant)))
|
||
(build-test "(with-continuation-mark 1 2 3)"
|
||
'(("(" default-color)
|
||
("with-continuation-mark" imported-syntax)
|
||
(" " default-color)
|
||
("1" constant)
|
||
(" " default-color)
|
||
("2" constant)
|
||
(" " default-color)
|
||
("3" constant)
|
||
(")" default-color)))
|
||
(build-test "(f x)"
|
||
'(("(" default-color)
|
||
("f" free-variable)
|
||
(" " default-color)
|
||
("x" free-variable)
|
||
(")" default-color)))
|
||
(build-test "(define-syntax (f stx) (syntax 1))"
|
||
'(("(" default-color)
|
||
("define-syntax" imported-syntax)
|
||
(" (" default-color)
|
||
("f" lexically-bound-syntax)
|
||
(" " default-color)
|
||
("stx" lexically-bound-variable)
|
||
(") (" default-color)
|
||
("syntax" imported-syntax)
|
||
(" " default-color)
|
||
("1" constant)
|
||
("))" default-color)))
|
||
|
||
(build-test "(define-for-syntax (f x) x)"
|
||
'(("(" default-color)
|
||
("define-for-syntax" imported-syntax)
|
||
(" (" default-color)
|
||
("f" lexically-bound-syntax)
|
||
(" " default-color)
|
||
("x" lexically-bound-variable)
|
||
(") " default-color)
|
||
("x" lexically-bound-variable)
|
||
(")" default-color))
|
||
(list '((22 23) (25 26))))
|
||
(build-test "(define-syntax-rule (m x y z) (list (λ x y) (λ x z)))\n(m x x x)"
|
||
'(("(" default-color)
|
||
("define-syntax-rule" imported)
|
||
(" (" default-color)
|
||
("m" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(" " default-color)
|
||
("y" lexically-bound)
|
||
(" " default-color)
|
||
("z" lexically-bound)
|
||
(") (list (λ " default-color)
|
||
("x" lexically-bound)
|
||
(" " default-color)
|
||
("y" lexically-bound)
|
||
(") (λ " default-color)
|
||
("x" lexically-bound)
|
||
(" " default-color)
|
||
("z" lexically-bound)
|
||
(")))\n(" default-color)
|
||
("m" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(")" default-color))
|
||
(list '((21 22) (55 56))
|
||
'((23 24) (39 40) (47 48))
|
||
'((25 26) (41 42))
|
||
'((27 28) (49 50))
|
||
'((57 58) (59 60) (61 62)))
|
||
#:tooltips '((21 22 "1 bound occurrence")
|
||
(23 24 "2 bound occurrences")
|
||
(25 26 "1 bound occurrence")
|
||
(27 28 "1 bound occurrence")
|
||
(57 58 "2 bound occurrences")))
|
||
|
||
(build-test "(define-syntax-rule (m x y z) (list (λ y x) (λ z x)))\n(m w w w)"
|
||
'(("(" default-color)
|
||
("define-syntax-rule" imported)
|
||
(" (" default-color)
|
||
("m" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(" " default-color)
|
||
("y" lexically-bound)
|
||
(" " default-color)
|
||
("z" lexically-bound)
|
||
(") (list (λ " default-color)
|
||
("y" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(") (λ " default-color)
|
||
("z" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(")))\n(" default-color)
|
||
("m" lexically-bound)
|
||
(" " default-color)
|
||
("w" lexically-bound)
|
||
(" " default-color)
|
||
("w" lexically-bound)
|
||
(" " default-color)
|
||
("w" lexically-bound)
|
||
(")" default-color))
|
||
(list '((21 22) (55 56))
|
||
'((23 24) (41 42) (49 50))
|
||
'((25 26) (39 40))
|
||
'((27 28) (47 48))
|
||
'((61 62) (57 58))
|
||
'((59 60) (57 58)))
|
||
#:tooltips '((21 22 "1 bound occurrence")
|
||
(23 24 "2 bound occurrences")
|
||
(25 26 "1 bound occurrence")
|
||
(27 28 "1 bound occurrence")
|
||
(57 58 "2 binding occurrences")
|
||
(59 60 "1 bound occurrence")
|
||
(61 62 "1 bound occurrence")))
|
||
|
||
(build-test "(module m mzscheme)"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme)" default-color)))
|
||
(build-test "(require-for-syntax mzscheme)"
|
||
'(("(" default-color)
|
||
("require-for-syntax" imported-syntax)
|
||
(" " default-color)
|
||
("mzscheme" unused-require)
|
||
(")" default-color)))
|
||
(build-test "(require mzlib/list)"
|
||
'(("(" default-color)
|
||
("require" imported-syntax)
|
||
(" " default-color)
|
||
("mzlib/list" unused-require)
|
||
(")" default-color)))
|
||
(build-test "(module m mzscheme (provide x) (define x 1))"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("provide" imported-syntax)
|
||
(" " default-color)
|
||
("x" lexically-bound-variable)
|
||
(") (" default-color)
|
||
("define" imported-syntax)
|
||
(" " default-color)
|
||
("x" lexically-bound-variable)
|
||
(" " default-color)
|
||
("1" constant)
|
||
("))" default-color))
|
||
(list '((10 18) (20 27) (32 38))
|
||
'((39 40) (28 29))))
|
||
|
||
(build-test "(module m mzscheme (+ 1 2))"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("+" imported-variable)
|
||
(" " default-color)
|
||
("1" constant)
|
||
(" " default-color)
|
||
("2" constant)
|
||
("))" default-color))
|
||
(list '((10 18) (20 21))))
|
||
|
||
(build-test "(module m mzscheme (require mzlib/list))"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("require" imported-syntax)
|
||
(" " default-color)
|
||
("mzlib/list" unused-require)
|
||
("))" default-color))
|
||
(list '((10 18) (20 27))))
|
||
|
||
(build-test "(module m mzscheme (require-for-syntax mzlib/list) (define-syntax s foldl))"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("require-for-syntax" imported-syntax)
|
||
(" mzlib/list) (" default-color)
|
||
("define-syntax" imported-syntax)
|
||
(" " default-color)
|
||
("s" lexically-bound-syntax)
|
||
(" " default-color)
|
||
("foldl" imported-variable)
|
||
("))" default-color))
|
||
(list '((10 18) (20 38) (52 65))
|
||
'((39 49) (68 73))))
|
||
|
||
(build-test "(module m mzscheme (require-for-syntax mzlib/etc) (define-syntax s (rec f 1)))"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("require-for-syntax" imported-syntax)
|
||
(" mzlib/etc) (" default-color)
|
||
("define-syntax" imported-syntax)
|
||
(" " default-color)
|
||
("s" lexically-bound-syntax)
|
||
(" (" default-color)
|
||
("rec" imported-syntax)
|
||
(" " default-color)
|
||
("f" lexically-bound-variable)
|
||
(" " default-color)
|
||
("1" constant)
|
||
(")))" default-color))
|
||
(list '((10 18) (20 38) (51 64))
|
||
'((39 48) (68 71))))
|
||
|
||
(build-test "(define-for-syntax (f x) x) (define (f x) x) f (define-syntax (m x) (f x))"
|
||
'(("(" default-color)
|
||
("define-for-syntax" imported)
|
||
(" (" default-color)
|
||
("f" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(") " default-color)
|
||
("x" lexically-bound)
|
||
(") (" default-color)
|
||
("define" imported)
|
||
(" (" default-color)
|
||
("f" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(") " default-color)
|
||
("x" lexically-bound)
|
||
(") " default-color)
|
||
("f" lexically-bound)
|
||
(" (" default-color)
|
||
("define-syntax" imported)
|
||
(" (" default-color)
|
||
("m" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(") (" default-color)
|
||
("f" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
("))" default-color))
|
||
'(((20 21) (69 70))
|
||
((22 23) (25 26))
|
||
((37 38) (45 46))
|
||
((39 40) (42 43))
|
||
((65 66) (71 72))))
|
||
|
||
(build-test "(module m mzscheme (define-for-syntax (f x) x) (define (f x) x) f (define-syntax (m stx) (f stx)))"
|
||
'(("(" default-color)
|
||
("module" imported)
|
||
(" m mzscheme (" default-color)
|
||
("define-for-syntax" imported)
|
||
(" (" default-color)
|
||
("f" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(") " default-color)
|
||
("x" lexically-bound)
|
||
(") (" default-color)
|
||
("define" imported)
|
||
(" (" default-color)
|
||
("f" lexically-bound)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(") " default-color)
|
||
("x" lexically-bound)
|
||
(") " default-color)
|
||
("f" lexically-bound)
|
||
(" (" default-color)
|
||
("define-syntax" imported)
|
||
(" (" default-color)
|
||
("m" lexically-bound)
|
||
(" " default-color)
|
||
("stx" lexically-bound)
|
||
(") (" default-color)
|
||
("f" lexically-bound)
|
||
(" " default-color)
|
||
("stx" lexically-bound)
|
||
(")))" default-color))
|
||
'(((10 18) (20 37) (48 54) (67 80))
|
||
((39 40) (90 91))
|
||
((41 42) (44 45))
|
||
((56 57) (64 65))
|
||
((58 59) (61 62))
|
||
((84 87) (92 95))))
|
||
|
||
(build-test "(define-syntax s (lambda (stx) (syntax-case stx () (_ 123))))"
|
||
'(("(" default-color)
|
||
("define-syntax" imported-syntax)
|
||
(" " default-color)
|
||
("s" lexically-bound-syntax)
|
||
(" (" default-color)
|
||
("lambda" imported-syntax)
|
||
(" (" default-color)
|
||
("stx" lexically-bound-variable)
|
||
(") (" default-color)
|
||
("syntax-case" imported-syntax)
|
||
(" " default-color)
|
||
("stx" lexically-bound-variable)
|
||
(" () (" default-color)
|
||
("_" lexically-bound-syntax)
|
||
(" " default-color)
|
||
("123" constant)
|
||
("))))" default-color))
|
||
(list '((26 29) (44 47))))
|
||
|
||
(build-test "(require mzlib/list) first"
|
||
'(("(" default-color)
|
||
("require" imported-syntax)
|
||
(" mzlib/list) " default-color)
|
||
("first" imported-variable))
|
||
(list '((9 19) (21 26))))
|
||
|
||
(build-test "(require mzlib/etc) (rec f 1)"
|
||
'(("(" default-color)
|
||
("require" imported-syntax)
|
||
(" mzlib/etc) (" default-color)
|
||
("rec" imported-syntax)
|
||
(" " default-color)
|
||
("f" lexically-bound-variable)
|
||
(" " default-color)
|
||
("1" constant)
|
||
(")" default-color))
|
||
(list '((9 18) (21 24))))
|
||
|
||
(build-test "(define-struct s ())"
|
||
'(("(" default-color)
|
||
("define-struct" imported-syntax)
|
||
(" " default-color)
|
||
("s" lexically-bound-syntax)
|
||
(" ())" default-color)))
|
||
|
||
(build-test "(define-struct s ()) (define-struct (t s) ())"
|
||
'(("(" default-color)
|
||
("define-struct" imported-syntax)
|
||
(" " default-color)
|
||
("s" lexically-bound-syntax)
|
||
(" ()) (" default-color)
|
||
("define-struct" imported-syntax)
|
||
(" (" default-color)
|
||
("t" lexically-bound-syntax)
|
||
(" " default-color)
|
||
("s" lexically-bound-syntax)
|
||
(") ())" default-color))
|
||
(list '((15 16) (39 40))))
|
||
|
||
(build-test "(let () (define-struct s (x)) 1)"
|
||
'(("(" default-color)
|
||
("let" imported-syntax)
|
||
(" () (" default-color)
|
||
("define-struct" imported-syntax)
|
||
(" " default-color)
|
||
("s" lexically-bound-syntax)
|
||
(" (x)) " default-color)
|
||
("1" constant)
|
||
(")" default-color)))
|
||
|
||
(build-test "(let ([x 12]) (define-struct s (x)) x)"
|
||
'(("(" default-color)
|
||
("let" imported-syntax)
|
||
(" ([" default-color)
|
||
("x" lexically-bound-variable)
|
||
(" " default-color)
|
||
("12" constant)
|
||
("]) (" default-color)
|
||
("define-struct" imported-syntax)
|
||
(" " default-color)
|
||
("s" lexically-bound-syntax)
|
||
(" (x)) " default-color)
|
||
("x" lexically-bound-variable)
|
||
(")" default-color))
|
||
(list '((7 8) (36 37))))
|
||
|
||
(build-test "`(1 ,x 2)"
|
||
'(("`" imported-syntax)
|
||
("(" default-color)
|
||
("1" constant)
|
||
(" ," default-color)
|
||
("x" free-variable)
|
||
(" " default-color)
|
||
("2" constant)
|
||
(")" default-color)))
|
||
|
||
(build-test "`(a ,2 b c d)"
|
||
`(("`" imported-syntax)
|
||
("(" default-color)
|
||
("a" constant)
|
||
(" ," default-color)
|
||
("2" constant)
|
||
(" " default-color)
|
||
("b" constant)
|
||
(" " default-color)
|
||
("c" constant)
|
||
(" " default-color)
|
||
("d" constant)
|
||
(")" default-color)))
|
||
|
||
(build-test "#! /usr/bin/env"
|
||
'(("#! /usr/bin/env" default-color)))
|
||
|
||
(build-test "#! /usr/bin/env\n"
|
||
'(("#! /usr/bin/env\n" default-color)))
|
||
|
||
(build-test "#! /usr/bin/env\n1"
|
||
'(("#! /usr/bin/env\n" default-color)
|
||
("1" constant)))
|
||
|
||
(build-test "#! /usr/bin/env\n1\n1"
|
||
'(("#! /usr/bin/env\n" default-color)
|
||
("1" constant)
|
||
("\n" default-color)
|
||
("1" constant)))
|
||
|
||
(build-test "#! /usr/bin/env\n(lambda (x) x)"
|
||
'(("#! /usr/bin/env\n(" default-color)
|
||
("lambda" imported-syntax)
|
||
(" (" default-color)
|
||
("x" lexically-bound-variable)
|
||
(") " default-color)
|
||
("x" lexically-bound-variable)
|
||
(")" default-color))
|
||
(list '((25 26) (28 29))))
|
||
|
||
(build-test "(module m mzscheme (lambda (x) x) (provide))"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("lambda" imported-syntax)
|
||
(" (" default-color)
|
||
("x" lexically-bound-variable)
|
||
(") " default-color)
|
||
("x" lexically-bound-variable)
|
||
(") (" default-color)
|
||
("provide" imported-syntax)
|
||
("))" default-color))
|
||
(list '((10 18) (20 26) (35 42))
|
||
'((28 29) (31 32))))
|
||
|
||
(build-test "(module m mzscheme (define-struct s (a)) s-a make-s s? set-s-a!)"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("define-struct" imported-syntax)
|
||
(" " default-color)
|
||
("s" lexically-bound-syntax)
|
||
(" (a)) " default-color)
|
||
("s-a" lexically-bound-variable)
|
||
(" " default-color)
|
||
("make-s" lexically-bound-variable)
|
||
(" " default-color)
|
||
("s?" lexically-bound-variable)
|
||
(" " default-color)
|
||
("set-s-a!" lexically-bound-variable)
|
||
(")" default-color))
|
||
(list '((10 18) (20 33))))
|
||
|
||
(build-test "(let l () l l)"
|
||
'(("(" default-color)
|
||
("let" imported-syntax)
|
||
(" " default-color)
|
||
("l" lexically-bound-variable)
|
||
(" () " default-color)
|
||
("l" lexically-bound-variable)
|
||
(" " default-color)
|
||
("l" lexically-bound-variable)
|
||
(")" default-color))
|
||
(list '((5 6) (10 11) (12 13))))
|
||
|
||
(build-test "(class object% this)"
|
||
'(("(" default-color)
|
||
("class" imported-syntax)
|
||
(" " default-color)
|
||
("object%" imported-syntax) ; was lexically-bound-variable
|
||
(" " default-color)
|
||
("this" imported)
|
||
(")" default-color)))
|
||
|
||
(build-test "(module m mzscheme (require mzlib/list) foldl)"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("require" imported-syntax)
|
||
(" mzlib/list) " default-color)
|
||
("foldl" imported-variable)
|
||
(")" default-color))
|
||
(list '((10 18) (20 27))
|
||
'((28 38) (40 45))))
|
||
(build-test "(module m lang/htdp-beginner empty)"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m lang/htdp-beginner " default-color)
|
||
("empty" imported-variable)
|
||
(")" default-color))
|
||
(list '((10 28) (29 34))))
|
||
(build-test "(module m mzscheme (require (prefix x: mzlib/list)) x:foldl)"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("require" imported-syntax)
|
||
(" (prefix x: mzlib/list)) " default-color)
|
||
("x:foldl" imported-variable)
|
||
(")" default-color))
|
||
(list '((10 18) (20 27))
|
||
'((39 49) (52 59))))
|
||
|
||
(build-test "(module m mzscheme (require (prefix x: mzlib/list) mzlib/list) x:foldl foldl)"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("require" imported-syntax)
|
||
(" (prefix x: mzlib/list) mzlib/list) " default-color)
|
||
("x:foldl" imported-variable)
|
||
(" " default-color)
|
||
("foldl" imported-variable)
|
||
(")" default-color))
|
||
(list '((10 18) (20 27))
|
||
'((39 49) (63 70))
|
||
'((51 61) (71 76))))
|
||
|
||
(build-test "(module m mzscheme (require (only mzlib/list foldr) (only mzlib/list foldl)) foldl foldr)"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("require" imported-syntax)
|
||
(" (only mzlib/list foldr) (only mzlib/list foldl)) " default-color)
|
||
("foldl" imported-variable)
|
||
(" " default-color)
|
||
("foldr" imported-variable)
|
||
(")" default-color))
|
||
(list '((10 18) (20 27))
|
||
'((34 44) (83 88))
|
||
'((58 68) (77 82))))
|
||
|
||
(build-test "(module m mzscheme (require (prefix x: mzscheme)) x:+ +)"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("require" imported-syntax)
|
||
(" (prefix x: mzscheme)) " default-color)
|
||
("x:+" imported-variable)
|
||
(" " default-color)
|
||
("+" imported-variable)
|
||
(")" default-color))
|
||
(list '((10 18) (20 27) (54 55))
|
||
'((39 47) (50 53))))
|
||
|
||
(build-test "(module m mzscheme (require mzlib/etc) (rec f 1))"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("require" imported-syntax)
|
||
(" mzlib/etc) (" default-color)
|
||
("rec" imported-syntax)
|
||
(" " default-color)
|
||
("f" lexically-bound-variable)
|
||
(" " default-color)
|
||
("1" constant)
|
||
("))" default-color))
|
||
(list '((10 18) (20 27))
|
||
'((28 37) (40 43))))
|
||
|
||
(build-test "(module m lang/htdp-intermediate (local ((define x x)) x))"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m lang/htdp-intermediate (" default-color)
|
||
("local" imported-syntax)
|
||
(" ((define " default-color)
|
||
("x" lexically-bound-variable)
|
||
(" " default-color)
|
||
("x" lexically-bound-variable)
|
||
(")) " default-color)
|
||
("x" lexically-bound-variable)
|
||
("))" default-color))
|
||
(list '((10 32) (34 39))
|
||
'((49 50) (51 52) (55 56))))
|
||
|
||
(build-test "(module m mzscheme (define-syntax rename #f) (require (rename mzscheme ++ +)))"
|
||
'(("(" default-color)
|
||
("module" imported)
|
||
(" m mzscheme (" default-color)
|
||
("define-syntax" imported)
|
||
(" " default-color)
|
||
("rename" lexically-bound)
|
||
(" #f) (" default-color)
|
||
("require" imported)
|
||
(" (rename mzscheme ++ +)))" default-color))
|
||
|
||
(list '((10 18) (20 33) (46 53))))
|
||
|
||
(build-test "(module m mzscheme (define-syntax rename #f) (define f 1) (provide (rename f g)))"
|
||
'(("(" default-color)
|
||
("module" imported)
|
||
(" m mzscheme (" default-color)
|
||
("define-syntax" imported)
|
||
(" " default-color)
|
||
("rename" lexically-bound)
|
||
(" #f) (" default-color)
|
||
("define" imported)
|
||
(" " default-color)
|
||
("f" lexically-bound)
|
||
(" 1) (" default-color)
|
||
("provide" imported)
|
||
(" (rename " default-color)
|
||
("f" lexically-bound)
|
||
(" g)))" default-color))
|
||
(list '((10 18) (20 33) (46 52) (59 66))
|
||
'((53 54) (75 76))))
|
||
|
||
(build-test "(module m mzscheme (define X 1) (provide (all-defined-except X)))"
|
||
'(("(" default-color)
|
||
("module" imported)
|
||
(" m mzscheme (" default-color)
|
||
("define" imported)
|
||
(" " default-color)
|
||
("X" lexically-bound)
|
||
(" 1) (" default-color)
|
||
("provide" imported)
|
||
(" (all-defined-except " default-color)
|
||
("X" lexically-bound)
|
||
(")))" default-color))
|
||
|
||
(list '((10 18) (20 26) (33 40))
|
||
'((27 28) (61 62))))
|
||
|
||
(build-test "(module m mzscheme (require-for-syntax mzscheme) (require-for-template mzscheme) (quote-syntax +))"
|
||
'(("(" default-color)
|
||
("module" imported)
|
||
(" m mzscheme (" default-color)
|
||
("require-for-syntax" imported)
|
||
(" mzscheme) (" default-color)
|
||
("require-for-template" imported)
|
||
(" mzscheme) (" default-color)
|
||
("quote-syntax" imported)
|
||
(" +))" default-color))
|
||
(list
|
||
'((71 79) (95 96))
|
||
'((10 18) (20 38) (50 70) (82 94) (95 96))
|
||
'((39 47) (95 96))))
|
||
|
||
;; test case from Chongkai
|
||
(build-test (format "~s\n\n#reader'reader\n1\n"
|
||
'(module reader mzscheme
|
||
(provide (rename mrs read-syntax) read)
|
||
(define (mrs sv p)
|
||
(datum->syntax-object
|
||
(read-syntax #f (open-input-string "a"))
|
||
`(module f mzscheme
|
||
(provide x)
|
||
(define x 1))
|
||
(list sv #f #f #f #f)))))
|
||
'(("(" default-color)
|
||
("module" imported)
|
||
(" reader mzscheme (" default-color)
|
||
("provide" imported)
|
||
(" (rename " default-color)
|
||
("mrs" lexically-bound)
|
||
(" read-syntax) " default-color)
|
||
("read" imported)
|
||
(") (" default-color)
|
||
("define" imported)
|
||
(" (" default-color)
|
||
("mrs" lexically-bound)
|
||
(" " default-color)
|
||
("sv" lexically-bound)
|
||
(" " default-color)
|
||
("p" lexically-bound)
|
||
(") (" default-color)
|
||
("datum->syntax-object" imported)
|
||
(" (" default-color)
|
||
("read-syntax" imported)
|
||
(" #f (" default-color)
|
||
("open-input-string" imported)
|
||
(" \"a\")) (" default-color)
|
||
("quasiquote" imported)
|
||
(" (module f mzscheme (provide x) (define x 1))) (" default-color)
|
||
("list" imported)
|
||
(" " default-color)
|
||
("sv" lexically-bound)
|
||
(" #f #f #f #f))))\n\n#reader'reader\n1\n" default-color))
|
||
|
||
(list '((15 23) (25 32) (58 62) (65 71) (84 104) (106 117) (122 139) (147 157) (205 209))
|
||
'((77 79) (210 212))
|
||
'((73 76) (41 44))))
|
||
|
||
(build-dir-test "(module m mzscheme (require \"~a/list.rkt\") foldl foldl)"
|
||
'(("(" default-color)
|
||
("module" imported-syntax)
|
||
(" m mzscheme (" default-color)
|
||
("require" imported-syntax)
|
||
(" \"" default-color)
|
||
(relative-path default-color)
|
||
("/list.rkt\") " default-color)
|
||
("foldl" imported-variable)
|
||
(" " default-color)
|
||
("foldl" imported-variable)
|
||
(")" default-color))
|
||
#f)
|
||
|
||
(build-test "#lang scheme/base\n(require scheme)\n(define-syntax m (lambda (x) #'1))"
|
||
'(("#lang scheme/base\n(" default-color)
|
||
("require" imported)
|
||
(" scheme)\n(" default-color)
|
||
("define-syntax" imported)
|
||
(" " default-color)
|
||
("m" lexically-bound)
|
||
(" (" default-color)
|
||
("lambda" imported)
|
||
(" (" default-color)
|
||
("x" lexically-bound)
|
||
(") " default-color)
|
||
("#'" imported)
|
||
("1))" default-color))
|
||
(list '((27 33) (19 26) (36 49) (53 59) (64 66))))
|
||
|
||
(build-test "#lang racket (begin-for-syntax (require (for-syntax racket)) (define x 1) (begin-for-syntax (define x 2) x))"
|
||
'(("#lang racket (" default-color)
|
||
("begin-for-syntax" imported)
|
||
(" (" default-color)
|
||
("require" imported)
|
||
(" (for-syntax " default-color)
|
||
("racket" default-color)
|
||
(")) (" default-color)
|
||
("define" imported)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(" 1) (" default-color)
|
||
("begin-for-syntax" imported)
|
||
(" (" default-color)
|
||
("define" imported)
|
||
(" " default-color)
|
||
("x" lexically-bound)
|
||
(" 2) " default-color)
|
||
("x" lexically-bound)
|
||
("))" default-color))
|
||
(list '((6 12) (14 30) (32 39) (62 68) (75 91))
|
||
'((52 58) (93 99))
|
||
'((100 101) (105 106))))
|
||
|
||
(build-test "#lang racket (provide (contract-out [f (->i ((p? any/c)) (_ (p?) p?))])) (define (f a) 1)"
|
||
'(("#lang racket (" default-color)
|
||
("provide" imported)
|
||
(" (contract-out [" default-color)
|
||
("f" lexically-bound)
|
||
(" (" default-color)
|
||
("->i" imported)
|
||
(" ((p? " default-color)
|
||
("any/c" imported)
|
||
(")) (_ (" default-color)
|
||
("p?" lexically-bound)
|
||
(") " default-color)
|
||
("p?" lexically-bound)
|
||
("))])) (" default-color)
|
||
("define" imported)
|
||
(" (" default-color)
|
||
("f" lexically-bound)
|
||
(" " default-color)
|
||
("a" lexically-bound)
|
||
(") 1)" default-color))
|
||
(list '((82 83) (37 38))
|
||
'((61 63) (65 67))
|
||
'((6 12) (14 21) (40 43) (49 54) (74 80))))
|
||
|
||
(build-test "#lang racket/base\n(define red 1)\n(module+ test red)"
|
||
'(("#lang racket/base\n(" default-color)
|
||
("define" imported)
|
||
(" " default-color)
|
||
("red" lexically-bound)
|
||
(" 1)\n(module+ test " default-color)
|
||
("red" imported)
|
||
(")" default-color))
|
||
'(((26 29) (47 50))
|
||
((6 17) (19 25))))
|
||
|
||
(build-test "#lang racket/base\n(require '#%kernel)\npair?"
|
||
'(("#lang racket/base\n(" default-color)
|
||
("require" imported)
|
||
(" '#%kernel)\n" default-color)
|
||
("pair?" imported))
|
||
(list '((6 17) (19 26))
|
||
'((27 36) (38 43))))
|
||
|
||
|
||
|
||
(build-rename-test "(lambda (x) x)"
|
||
9
|
||
"x"
|
||
"y"
|
||
"(lambda (y) y)")
|
||
|
||
(build-rename-test "(lambda (x) x)"
|
||
9
|
||
"x"
|
||
"yy"
|
||
"(lambda (yy) yy)")
|
||
|
||
(build-rename-test "(lambda (x) x)"
|
||
9
|
||
"x"
|
||
"yxy"
|
||
"(lambda (yxy) yxy)")
|
||
(build-rename-test "(lambda (x) x x)"
|
||
9
|
||
"x"
|
||
"yxy"
|
||
"(lambda (yxy) yxy yxy)")
|
||
(build-rename-test "(lambda (x) x x)"
|
||
12
|
||
"x"
|
||
"yxy"
|
||
"(lambda (yxy) yxy yxy)")
|
||
(build-rename-test "(lambda (x) x x)"
|
||
14
|
||
"x"
|
||
"yxy"
|
||
"(lambda (yxy) yxy yxy)")
|
||
|
||
(build-rename-test "(define-syntax-rule (m x) (λ (x) x))(m z)"
|
||
39
|
||
"z"
|
||
"qq"
|
||
"(define-syntax-rule (m x) (λ (x) x))(m qq)")
|
||
|
||
(build-rename-test (string-append
|
||
"#lang racket/base\n"
|
||
"(require (for-syntax racket/base))\n"
|
||
"(define-syntax-rule (m x)\n"
|
||
" (begin (λ (x) x) (define x 1) (λ (x) x)))\n"
|
||
"(m x)\n"
|
||
"x\n")
|
||
126
|
||
"x"
|
||
"y"
|
||
(string-append
|
||
"#lang racket/base\n"
|
||
"(require (for-syntax racket/base))\n"
|
||
"(define-syntax-rule (m x)\n"
|
||
" (begin (λ (x) x) (define x 1) (λ (x) x)))\n"
|
||
"(m y)\n"
|
||
"y\n"))
|
||
|
||
(build-rename-test (string-append
|
||
"#lang racket"
|
||
"\n"
|
||
"(define player%\n"
|
||
" (class object%\n"
|
||
" (init-field strategy player# tiles)\n"
|
||
" (field [score (set)])\n"
|
||
"\n"
|
||
" (super-new)\n"
|
||
"\n"
|
||
" (define/private (put t pl)\n"
|
||
" (set! tiles(remove t tiles)))))\n")
|
||
80
|
||
"tiles"
|
||
"*tiles"
|
||
(string-append
|
||
"#lang racket"
|
||
"\n"
|
||
"(define player%\n"
|
||
" (class object%\n"
|
||
" (init-field strategy player# *tiles)\n"
|
||
" (field [score (set)])\n"
|
||
"\n"
|
||
" (super-new)\n"
|
||
"\n"
|
||
" (define/private (put t pl)\n"
|
||
" (set! *tiles(remove t *tiles)))))\n"))
|
||
|
||
(build-rename-test (string-append
|
||
"#lang racket"
|
||
"\n"
|
||
"(define player%\n"
|
||
" (class object%\n"
|
||
" (init-field strategy player# *tiles)\n"
|
||
" (field [score (set)])\n"
|
||
"\n"
|
||
" (super-new)\n"
|
||
"\n"
|
||
" (define/private (put t pl)\n"
|
||
" (set! *tiles(remove t *tiles)))))\n")
|
||
80
|
||
"*tiles"
|
||
"tiles"
|
||
(string-append
|
||
"#lang racket"
|
||
"\n"
|
||
"(define player%\n"
|
||
" (class object%\n"
|
||
" (init-field strategy player# tiles)\n"
|
||
" (field [score (set)])\n"
|
||
"\n"
|
||
" (super-new)\n"
|
||
"\n"
|
||
" (define/private (put t pl)\n"
|
||
" (set! tiles(remove t tiles)))))\n"))))
|
||
|
||
|
||
(define (main)
|
||
(fire-up-drracket-and-run-tests
|
||
(λ ()
|
||
(let ([drs (wait-for-drracket-frame)])
|
||
;(set-language-level! (list "Pretty Big"))
|
||
(begin
|
||
(set-language-level! (list "Pretty Big") #f)
|
||
(test:set-radio-box-item! "No debugging or profiling")
|
||
(let ([f (test:get-active-top-level-window)])
|
||
(test:button-push "OK")
|
||
(wait-for-new-frame f)))
|
||
(do-execute drs)
|
||
(let* ([defs (queue-callback/res (λ () (send drs get-definitions-text)))]
|
||
[filename (make-temporary-file "syncheck-test~a")])
|
||
(let-values ([(dir _1 _2) (split-path filename)])
|
||
(queue-callback/res (λ () (send defs save-file filename)))
|
||
(preferences:set 'framework:coloring-active #f)
|
||
(close-the-error-window-test drs)
|
||
(for-each (run-one-test (normalize-path dir)) tests)
|
||
(preferences:set 'framework:coloring-active #t)
|
||
(queue-callback/res
|
||
(λ ()
|
||
(send defs save-file) ;; clear out autosave
|
||
(send defs set-filename #f)))
|
||
(delete-file filename)
|
||
|
||
(printf "Ran ~a tests.\n" total-tests-run)))))))
|
||
|
||
(define (close-the-error-window-test drs)
|
||
(clear-definitions drs)
|
||
(insert-in-definitions drs "(")
|
||
(click-check-syntax-button drs)
|
||
(wait-for-computation drs)
|
||
(unless (queue-callback/res (λ () (send drs syncheck:error-report-visible?)))
|
||
(error 'close-the-error-window-test "error report window never appeared"))
|
||
(do-execute drs)
|
||
(when (queue-callback/res (λ () (send drs syncheck:error-report-visible?)))
|
||
(error 'close-the-error-window-test "error report window did not go away after clicking Run")))
|
||
|
||
(define total-tests-run 0)
|
||
|
||
(define ((run-one-test save-dir) test)
|
||
(set! total-tests-run (+ total-tests-run 1))
|
||
(let* ([drs (wait-for-drracket-frame)]
|
||
[defs (queue-callback/res (λ () (send drs get-definitions-text)))])
|
||
(clear-definitions drs)
|
||
(cond
|
||
[(test? test)
|
||
(let ([input (test-input test)]
|
||
[expected (test-expected test)]
|
||
[arrows (test-arrows test)]
|
||
[tooltips (test-tooltips test)]
|
||
[relative (find-relative-path save-dir (collection-path "mzlib"))])
|
||
(cond
|
||
[(dir-test? test)
|
||
(insert-in-definitions drs (format input (path->require-string relative)))]
|
||
[else (insert-in-definitions drs input)])
|
||
(click-check-syntax-and-check-errors drs test)
|
||
|
||
;; need to check for syntax error here
|
||
(let ([got (get-annotated-output drs)])
|
||
(compare-output (cond
|
||
[(dir-test? test)
|
||
(map (lambda (x)
|
||
(list (if (eq? (car x) 'relative-path)
|
||
(path->require-string relative)
|
||
(car x))
|
||
(cadr x)))
|
||
expected)]
|
||
[else
|
||
expected])
|
||
got
|
||
arrows
|
||
(queue-callback/res (λ () (send defs syncheck:get-bindings-table)))
|
||
input))
|
||
(when tooltips
|
||
(compare-tooltips (queue-callback/res (λ () (send defs syncheck:get-bindings-table #t)))
|
||
tooltips
|
||
(test-line test))))]
|
||
[(rename-test? test)
|
||
(insert-in-definitions drs (rename-test-input test))
|
||
(click-check-syntax-and-check-errors drs test)
|
||
(define menu-item
|
||
(queue-callback/res
|
||
(λ ()
|
||
(define defs (send drs get-definitions-text))
|
||
(define menu (make-object popup-menu%))
|
||
(send defs syncheck:build-popup-menu menu (rename-test-pos test) defs)
|
||
(define item-name (format "Rename ~a" (rename-test-old-name test)))
|
||
(define menu-item
|
||
(for/or ([x (in-list (send menu get-items))])
|
||
(and (is-a? x labelled-menu-item<%>)
|
||
(equal? (send x get-label) item-name)
|
||
x)))
|
||
(cond
|
||
[menu-item
|
||
menu-item]
|
||
[else
|
||
(eprintf "syncheck-test.rkt: rename test ~s didn't find menu item named ~s in ~s"
|
||
test
|
||
item-name
|
||
(map (λ (x) (and (is-a? x labelled-menu-item<%>) (send x get-label)))
|
||
(send menu get-items)))
|
||
#f]))))
|
||
(when menu-item
|
||
(queue-callback (λ () (send menu-item command (make-object control-event% 'menu))))
|
||
(wait-for-new-frame drs)
|
||
(for ([x (in-string (rename-test-new-name test))])
|
||
(test:keystroke x))
|
||
(test:button-push "OK")
|
||
(define result
|
||
(queue-callback/res (λ ()
|
||
(define defs (send drs get-definitions-text))
|
||
(send defs get-text 0 (send defs last-position)))))
|
||
(unless (equal? result (rename-test-output test))
|
||
(eprintf "syncheck-test.rkt FAILED\n test ~s\n got ~s\n"
|
||
test
|
||
result)))])))
|
||
|
||
(define (path->require-string relative)
|
||
(define (p->string p)
|
||
(cond
|
||
[(eq? p 'up) ".."]
|
||
[else (path->string p)]))
|
||
(apply string-append (add-between (map p->string (explode-path relative)) "/")))
|
||
|
||
|
||
(define remappings
|
||
'((constant default-color)
|
||
(imported-syntax imported)
|
||
(imported-variable imported)
|
||
(lexically-bound-syntax lexically-bound)
|
||
(lexically-bound-variable lexically-bound)))
|
||
|
||
(define (collapse-and-rename expected)
|
||
(let ([renamed
|
||
(map (lambda (ent)
|
||
(let* ([str (car ent)]
|
||
[id (cadr ent)]
|
||
[matches (assoc id remappings)])
|
||
(if matches
|
||
(list str (cadr matches))
|
||
ent)))
|
||
expected)])
|
||
(let loop ([ids renamed])
|
||
(cond
|
||
[(null? ids) null]
|
||
[(null? (cdr ids)) ids]
|
||
[else (let ([fst (car ids)]
|
||
[snd (cadr ids)])
|
||
(if (eq? (cadr fst) (cadr snd))
|
||
(loop (cons (list (string-append (car fst) (car snd)) (cadr fst))
|
||
(cddr ids)))
|
||
(cons fst (loop (cdr ids)))))]))))
|
||
|
||
;; compare-arrows : expression
|
||
;; (listof (cons (list number number) (listof (list number number))))
|
||
;; hash-table[(list text number number) -o> (listof (list text number number))]
|
||
;; -> void
|
||
(define (compare-arrows test-exp expected raw-actual)
|
||
(when expected
|
||
(let ()
|
||
(define already-checked (make-hash))
|
||
|
||
(define actual-ht (make-hash))
|
||
(define stupid-internal-define-syntax1
|
||
(hash-for-each raw-actual
|
||
(lambda (k v)
|
||
(hash-set! actual-ht (cdr k)
|
||
(sort (map cdr v)
|
||
(lambda (x y) (< (car x) (car y))))))))
|
||
(define expected-ht (make-hash))
|
||
(define stupid-internal-define-syntax2
|
||
(for-each (lambda (binding) (hash-set! expected-ht (car binding) (cdr binding)))
|
||
expected))
|
||
;; binding-in-ht? : hash-table (list number number) (listof (list number number)) -> boolean
|
||
(define (test-binding expected? ht)
|
||
(lambda (pr)
|
||
(let ([frm (car pr)]
|
||
[to (cdr pr)])
|
||
(hash-ref
|
||
already-checked
|
||
frm
|
||
(lambda ()
|
||
(hash-set! already-checked frm #t)
|
||
(let ([ht-ent (hash-ref ht frm (lambda () 'nothing-there))])
|
||
(unless (equal? ht-ent to)
|
||
(eprintf (if expected?
|
||
"FAILED arrow test ~s from ~s\n expected ~s\n actual ~s\n"
|
||
"FAILED arrow test ~s from ~s\n actual ~s\n expected ~s\n")
|
||
test-exp
|
||
frm
|
||
ht-ent
|
||
to))))))))
|
||
|
||
(for-each (test-binding #t expected-ht) (hash-map actual-ht cons))
|
||
(for-each (test-binding #f actual-ht) (hash-map expected-ht cons)))))
|
||
|
||
(define (compare-output raw-expected got arrows arrows-got input)
|
||
(let ([expected (collapse-and-rename raw-expected)])
|
||
(cond
|
||
[(equal? got expected)
|
||
(compare-arrows input arrows arrows-got)]
|
||
[else
|
||
(eprintf "FAILED: ~s\n expected: ~s\n got: ~s\n"
|
||
input expected got)])))
|
||
|
||
(define (compare-tooltips got expected line)
|
||
(unless (equal? got expected)
|
||
(eprintf "FAILED TOOLTIPS: line ~s \n expected: ~s\n got: ~s\n"
|
||
line expected got)))
|
||
|
||
;; get-annotate-output : drscheme-frame -> (listof str/ann)
|
||
(define (get-annotated-output drs)
|
||
(queue-callback/res (λ () (get-string/style-desc (send drs get-definitions-text)))))
|
||
|
||
(define (click-check-syntax-and-check-errors drs test)
|
||
(click-check-syntax-button drs)
|
||
(wait-for-computation drs)
|
||
(when (queue-callback/res (λ () (send (send drs get-definitions-text) in-edit-sequence?)))
|
||
(error 'syncheck-test.rkt "still in edit sequence for ~s" test))
|
||
|
||
(let ([err (queue-callback/res (λ () (send drs syncheck:get-error-report-contents)))])
|
||
(when err
|
||
(eprintf "FAILED ~s\n error report window is visible:\n ~a\n"
|
||
test
|
||
err))))
|
||
|
||
(define (click-check-syntax-button drs)
|
||
(test:run-one (lambda () (send (send drs syncheck:get-button) command))))
|
||
|
||
(main)
|