racket/collects/tests/drracket/syncheck-test.rkt
Robby Findler b972a0940d Added online expansion and compilation of files
being edited in DrRacket (via places)

Added an API to let tools have access to that
  information (and compute more stuff)

Used that to make an online version of Check Syntax
  which led to a separately callable Check Syntax API.
2011-08-02 16:28:16 -05:00

1192 lines
53 KiB
Racket

#lang racket/base
#|
tests involving object% are commented out, since they
trigger runtime errors in check syntax.
|#
(require "drracket-test-util.rkt"
string-constants/string-constant
tests/utils/gui
racket/path
racket/class
racket/list
racket/file
mred
framework
mrlib/text-string-style-desc)
(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)))))
(define-struct test (input expected arrows) #:transparent)
(define-struct (dir-test test) () #:transparent)
(define-struct rename-test (input pos old-name new-name output) #:transparent)
(define build-test
(λ (input expected [arrow-table '()])
(make-test input expected arrow-table)))
;; 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))))
(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))))
(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))))
(build-test "(module m mzscheme)"
'(("(" default-color)
("module" imported-syntax)
(" m " default-color)
("mzscheme" unused-require)
(")" 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))
'((28 50) (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))
'((28 50) (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))
'((28 51) (77 82) (83 88))
'((52 75) (77 82) (83 88))))
(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))
'((28 48) (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))))
(make-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 " default-color)
("scheme/base" unused-require)
("\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))))
(rename-test "(lambda (x) x)"
9
"x"
"y"
"(lambda (y) y)")
(rename-test "(lambda (x) x)"
9
"x"
"yy"
"(lambda (yy) yy)")
(rename-test "(lambda (x) x)"
9
"x"
"yxy"
"(lambda (yxy) yxy)")
(rename-test "(lambda (x) x x)"
9
"x"
"yxy"
"(lambda (yxy) yxy yxy)")
(rename-test "(lambda (x) x x)"
12
"x"
"yxy"
"(lambda (yxy) yxy yxy)")
(rename-test "(lambda (x) x x)"
14
"x"
"yxy"
"(lambda (yxy) yxy yxy)")
(rename-test "(define-syntax-rule (m x) (λ (x) x))(m z)"
39
"z"
"qq"
"(define-syntax-rule (m x) (λ (x) x))(m qq)")
(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"))
(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-drscheme-and-run-tests
(λ ()
(let ([drs (wait-for-drscheme-frame)])
(set-language-level! (list "Pretty Big"))
(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-drscheme-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)]
[relative (find-relative-path save-dir (collection-path "mzlib"))])
(cond
[(dir-test? test)
(insert-in-definitions drs (format input (path->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->string relative)
(car x))
(cadr x)))
expected)]
[else
expected])
got
arrows
(queue-callback/res (λ () (send defs syncheck:get-bindings-table)))
input)))]
[(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 (send defs syncheck:build-popup-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
(fprintf (current-error-port)
"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))
(fprintf (current-error-port)
"syncheck-test.rkt FAILED\n test ~s\n got ~s\n"
test
result)))])))
(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)
(fprintf (current-error-port)
(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
(fprintf (current-error-port)
"FAILED: ~s\n expected: ~s\n got: ~s\n"
input 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
(fprintf (current-error-port)
"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)