add check for adjacent separators into tests

This commit is contained in:
Robby Findler 2012-08-07 12:51:52 -05:00
parent 2256ca39ea
commit 4a19ab40e8

View File

@ -1,63 +1,123 @@
#lang racket #lang racket
#|
This test checks:
- if opening frames/tabs leaks,
- if DrRacket writes to the filesystem during startup or
while opening tabs/frames
- if there are any adjacent separators in the menus
|#
(require "private/drracket-test-util.rkt" (require "private/drracket-test-util.rkt"
racket/gui/base
framework) framework)
(parameterize ([current-security-guard (define (main)
(make-security-guard (parameterize ([current-security-guard
(current-security-guard) (make-security-guard
(λ (who pth what) (current-security-guard)
(when (member 'write what) (λ (who pth what)
(error who "Writing to the file system is not allowed")) (when (member 'write what)
(when (member 'delete what) (error who "Writing to the file system is not allowed"))
(error who "Deleting files is not allowed"))) (when (member 'delete what)
void (error who "Deleting files is not allowed")))
void)]) void
(fire-up-drracket-and-run-tests void)])
(λ () (fire-up-drracket-and-run-tests
(define drs-frame1 (wait-for-drracket-frame)) (λ ()
(sync (system-idle-evt)) (define drs-frame1 (wait-for-drracket-frame))
(for ([tries (in-range 3)])
(test:menu-select "File" "New Tab")
(sync (system-idle-evt)) (sync (system-idle-evt))
(define drs-tabb (make-weak-box (send drs-frame1 get-current-tab))) (check-menus drs-frame1)
(define tab-nsb (make-weak-box (send (send (send drs-frame1 get-current-tab) get-ints) get-user-namespace)))
(test:menu-select "File" (if (eq? (system-type) 'unix) "Close" "Close Tab")) (for ([tries (in-range 3)])
(sync (system-idle-evt)) (test:menu-select "File" "New Tab")
(sync (system-idle-evt))
(test:menu-select "File" "New")
(sync (system-idle-evt)) (define drs-tabb (make-weak-box (send drs-frame1 get-current-tab)))
(define tab-nsb (make-weak-box (send (send (send drs-frame1 get-current-tab) get-ints) get-user-namespace)))
(define drs-frame2b (make-weak-box (wait-for-new-frame drs-frame1)))
(define frame2-nsb (make-weak-box (send (send (send (weak-box-value drs-frame2b) get-current-tab) get-ints) get-user-namespace))) (test:menu-select "File" (if (eq? (system-type) 'unix) "Close" "Close Tab"))
(sync (system-idle-evt))
(queue-callback/res
(λ () (send (send (send (weak-box-value drs-frame2b) get-current-tab) get-defs) load-file (test:menu-select "File" "New")
(collection-file-path "unit.rkt" "drracket" "private")))) (sync (system-idle-evt))
(sleep 2)
(sync (system-idle-evt)) (define drs-frame2b (make-weak-box (wait-for-new-frame drs-frame1)))
(define frame2-nsb (make-weak-box (send (send (send (weak-box-value drs-frame2b) get-current-tab) get-ints) get-user-namespace)))
(test:menu-select "File" (if (eq? (system-type) 'unix) "Close" "Close Window"))
(sync (system-idle-evt)) (queue-callback/res
(λ () (send (send (send (weak-box-value drs-frame2b) get-current-tab) get-defs) load-file
(let loop ([n 30]) (collection-file-path "unit.rkt" "drracket" "private"))))
(cond (sleep 2)
[(zero? n) (sync (system-idle-evt))
(when (weak-box-value drs-tabb)
(eprintf "frame leak!\n")) (test:menu-select "File" (if (eq? (system-type) 'unix) "Close" "Close Window"))
(when (weak-box-value drs-frame2b) (sync (system-idle-evt))
(eprintf "tab leak!\n"))
(when (weak-box-value tab-nsb) (let loop ([n 30])
(eprintf "tab namespace leak!\n")) (cond
(when (weak-box-value frame2-nsb) [(zero? n)
(eprintf "frame namespace leak!\n"))] (when (weak-box-value drs-tabb)
[else (eprintf "frame leak!\n"))
(collect-garbage) (sync (system-idle-evt)) (when (weak-box-value drs-frame2b)
(when (ormap weak-box-value (eprintf "tab leak!\n"))
(list drs-tabb (when (weak-box-value tab-nsb)
tab-nsb (eprintf "tab namespace leak!\n"))
drs-frame2b (when (weak-box-value frame2-nsb)
frame2-nsb)) (eprintf "frame namespace leak!\n"))]
(loop (- n 1)))])))))) [else
(collect-garbage) (sync (system-idle-evt))
(when (ormap weak-box-value
(list drs-tabb
tab-nsb
drs-frame2b
frame2-nsb))
(loop (- n 1)))])))))))
(define (check-menus frame)
(define (process-container container)
(define sub-items (send container get-items))
(unless (null? sub-items)
(when (is-a? (car sub-items) menu-item-container<%>)
(process-container (car sub-items)))
(define printed? #f)
(for ([prev-item (in-list sub-items)]
[item (in-list (cdr sub-items))])
(when (and (is-a? prev-item separator-menu-item%)
(is-a? item separator-menu-item%)
(not printed?))
(set! printed? #t)
(eprintf "found two adjacent separator items in: ~s:\n" (get-names container))
(for ([item (in-list sub-items)])
(eprintf " ~a\n" (get-lab item)))
(eprintf "\n"))
(when (is-a? item menu-item-container<%>)
(process-container item)))))
(define (get-lab item)
(cond
[(is-a? item labelled-menu-item<%>)
(send item get-label)]
[(is-a? item separator-menu-item%)
"---------"]
[else #f]))
(define (get-names item)
(let loop ([item item])
(cond
[(is-a? item menu-item<%>)
(cons (get-lab item)
(loop (send item get-parent)))]
[else
'()])))
(process-container (send frame get-menu-bar)))
(main)