Merge pull request #61 from florence/support-at-exp

Support at exp, fixing #55
This commit is contained in:
Spencer Florence 2015-03-30 23:06:30 -04:00
commit c4bd7f80c9
5 changed files with 57 additions and 48 deletions

View File

@ -5,7 +5,7 @@
"syntax-color-lib" "compiler-lib")) "syntax-color-lib" "compiler-lib"))
(define build-deps (define build-deps
'("racket-doc" "scribble-lib" "typed-racket-doc" "htdp-lib" '("racket-doc" "scribble-lib" "typed-racket-doc" "htdp-lib"
"net-doc" "scribble-doc")) "net-doc" "scribble-doc" "at-exp-lib"))
(define raco-commands (define raco-commands
'(("cover" (submod cover/raco main) "a code coverage tool" 30))) '(("cover" (submod cover/raco main) "a code coverage tool" 30)))

View File

@ -8,6 +8,7 @@
racket/set racket/set
racket/bool racket/bool
syntax-color/racket-lexer syntax-color/racket-lexer
syntax-color/lexer-contract
syntax/modread syntax/modread
syntax/parse syntax/parse
"shared.rkt") "shared.rkt")
@ -47,11 +48,12 @@
(with-input-from-file f (with-input-from-file f
(thunk (thunk
(define lexer (define lexer
(with-handlers ([exn:fail:read? (const racket-lexer)]) (maybe-wrap-lexer
(define f (read-language)) (with-handlers ([exn:fail:read? (const racket-lexer)])
(if f (define f (read-language))
(f 'color-lexer racket-lexer) (if f
racket-lexer))) (f 'color-lexer racket-lexer)
racket-lexer))))
(define irrelevant? (make-irrelevant? lexer f submods)) (define irrelevant? (make-irrelevant? lexer f submods))
(define file-length (string-length (file->string f))) (define file-length (string-length (file->string f)))
(define cache (define cache
@ -61,6 +63,13 @@
[else (raw-covered? i c)])))) [else (raw-covered? i c)]))))
cache))) cache)))
(define (maybe-wrap-lexer lexer)
(if (procedure-arity-includes? lexer 3)
lexer
(λ (in offset mode)
(define-values (a b c d e) (lexer in))
(values a b c d e 0 #f))))
;; Lexer(in the sence of color:text<%>) InputPort (Maybe (Listof Symbol)) -> (Natural -> Boolean) ;; Lexer(in the sence of color:text<%>) InputPort (Maybe (Listof Symbol)) -> (Natural -> Boolean)
;; builds a function that determines if a given location in that port is irrelivent. ;; builds a function that determines if a given location in that port is irrelivent.
(define (make-irrelevant? lexer f submods) (define (make-irrelevant? lexer f submods)
@ -72,15 +81,19 @@
(define offset (make-byte->str-offset str)) (define offset (make-byte->str-offset str))
(let loop () (let loop ([mode #f])
(define-values (v type _m start end) (lexer for-lex)) (define-values (v type _m start end backup-dist new-mode/ds)
(lexer for-lex 0 mode))
(define new-mode (if (dont-stop? new-mode/ds)
(dont-stop-val new-mode/ds)
new-mode/ds))
(case type (case type
[(eof) (void)] [(eof) (void)]
[(comment sexp-comment no-color white-space) [(comment sexp-comment no-color white-space)
(for ([i (in-range (- start (offset start)) (- end (offset end)))]) (for ([i (in-range (- start (offset start)) (- end (offset end)))])
(set-add! s (+ init-offset i))) (set-add! s (+ init-offset i)))
(loop)] (loop new-mode)]
[else (loop)])) [else (loop new-mode)]))
(define stx (define stx
(with-input-from-file f (with-input-from-file f
(thunk (with-module-reading-parameterization read-syntax)))) (thunk (with-module-reading-parameterization read-syntax))))
@ -149,19 +162,20 @@
(module+ test (module+ test
(define-runtime-path path2 "../tests/prog.rkt") (define-runtime-path path2 "../tests/prog.rkt")
(test-begin (parameterize ([irrelevant-submodules #f])
(define f (path->string (simplify-path path2))) (test-begin
(test-files! f) (define f (path->string (simplify-path path2)))
(define coverage (hash-ref (get-test-coverage) f)) (test-files! f)
(define covered? (make-covered? coverage f)) (define coverage (hash-ref (get-test-coverage) f))
(check-equal? (covered? 14) 'irrelevant) (define covered? (make-covered? coverage f))
(check-equal? (covered? 14 #:byte? #t) 'irrelevant) (check-equal? (covered? 14) 'irrelevant)
(check-equal? (covered? 17) 'irrelevant) (check-equal? (covered? 14 #:byte? #t) 'irrelevant)
(check-equal? (covered? 28) 'irrelevant) (check-equal? (covered? 17) 'irrelevant)
(check-equal? (covered? 35) 'covered) (check-equal? (covered? 28) 'irrelevant)
(check-equal? (covered? 50) 'uncovered) (check-equal? (covered? 35) 'covered)
(check-equal? (covered? 51 #:byte? #t) 'uncovered) (check-equal? (covered? 50) 'uncovered)
(check-equal? (covered? 52) 'irrelevant) (check-equal? (covered? 51 #:byte? #t) 'uncovered)
(check-equal? (covered? 53) 'irrelevant) (check-equal? (covered? 52) 'irrelevant)
(check-equal? (covered? 54) 'irrelevant) (check-equal? (covered? 53) 'irrelevant)
(clear-coverage!))) (check-equal? (covered? 54) 'irrelevant)
(clear-coverage!))))

2
tests/at-exp/at-exp.rkt Normal file
View File

@ -0,0 +1,2 @@
#lang at-exp racket
@void{1}

2
tests/at-exp/at-exp.rktl Normal file
View File

@ -0,0 +1,2 @@
()
()

View File

@ -3,7 +3,8 @@
;; for every .rkt file in those directories it loads ;; for every .rkt file in those directories it loads
;; tests that file and checks its coverage against an ;; tests that file and checks its coverage against an
;; .rktl file of the same name ;; .rktl file of the same name
(require (only-in "../main.rkt" test-files! clear-coverage! get-test-coverage irrelevant-submodules) (require (only-in "../main.rkt" test-files! clear-coverage! get-test-coverage irrelevant-submodules
make-covered?)
"../private/file-utils.rkt" "../private/file-utils.rkt"
racket/runtime-path rackunit) racket/runtime-path rackunit)
@ -27,15 +28,17 @@
(define-values (expected-coverage expected-uncoverage) (define-values (expected-coverage expected-uncoverage)
(with-input-from-file cover (lambda () (values (ranges->numbers (read)) (with-input-from-file cover (lambda () (values (ranges->numbers (read))
(ranges->numbers (read)))))) (ranges->numbers (read))))))
(define covered? (make-covered? actual-coverage program))
(define (test-range range type)
(for ([i range])
(define v (covered? i))
(unless (eq? v 'irrelevant)
(check-equal? v type
(format "expected char ~a to be covered, but it was not, in: ~s"
i program)))))
(test-begin (test-begin
(for ([i expected-coverage]) (test-range expected-coverage 'covered)
(check-true (covered? i actual-coverage) (test-range expected-uncoverage 'uncovered)))
(format "expected char ~a to be covered, but it was not, in: ~s"
i program)))
(for ([i expected-uncoverage])
(check-true (not (covered? i actual-coverage))
(format "expected char ~a to be uncovered, but it was, in: ~s"
i program)))))
(clear-coverage!)) (clear-coverage!))
@ -51,20 +54,8 @@
(ranges->numbers r) (ranges->numbers r)
(cons a (ranges->numbers (cons (list (add1 a) b) r))))])) (cons a (ranges->numbers (cons (list (add1 a) b) r))))]))
(define (covered? i map)
(for*/and ([l map]
[b (in-value (first l))]
[srcloc (in-value (second l))]
#:when (within? i srcloc))
b))
(define (within? i src)
(match src
[(srcloc _ _ _ start range)
(<= start i (+ start range))]))
(module+ test (module+ test
(define-runtime-path-list test-dirs '("basic" "simple-multi" "syntax")) (define-runtime-path-list test-dirs '("basic" "simple-multi" "syntax" "at-exp"))
(for-each (compose test-dir path->string) test-dirs) (for-each (compose test-dir path->string) test-dirs)
(define-runtime-path submods "submods") (define-runtime-path submods "submods")
(parameterize ([irrelevant-submodules null]) (parameterize ([irrelevant-submodules null])