gui/gui-test/tests/gracket/windowing.rktl
2014-12-02 02:33:07 -05:00

1177 lines
32 KiB
Racket

(load-relative "loadtest.rktl")
(define shorter? #t)
; These message boxes mustn't survive
(let ([c (make-custodian)])
(parameterize ([current-custodian c])
(parameterize ([current-eventspace (make-eventspace)])
(queue-callback
(lambda ()
(queue-callback
(lambda ()
(sleep/yield 0.1)
(queue-callback
(lambda ()
(custodian-shutdown-all c)))
(message-box "w" "q")))
(message-box "x" "y"))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Windowing Tests ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Some tests can't work on X due to window-manager
;; prerogative and race conditions
(define-syntax (X-FAILS stx)
(if (eq? (system-type) 'unix)
(syntax (void))
(syntax-case stx () [(_ e) #'e])))
(define (pause)
(let ([s (make-semaphore)])
(flush-display)
(thread (lambda () (sleep 0.01) (semaphore-post s)))
(test s 'yield (yield s))))
(define (iconize-pause)
(pause))
(let ([s (make-semaphore 1)])
(test s 'yield-wrapped (yield s)))
(let ([s (make-semaphore 1)])
(test (list s) 'yield-wrapped (yield (wrap-evt s (lambda (v) (list v))))))
(let ([s (make-semaphore)])
(thread (lambda () (sleep 0.01) (semaphore-post s)))
(test (list s) 'yield-wrapped (yield (wrap-evt s (lambda (v) (list v))))))
(define (enable-tests f)
(printf "Enable ~a\n" f)
(st #t f is-enabled?)
(stv f enable #f)
(st #f f is-enabled?)
(stv f enable #t)
(st #t f is-enabled?))
(define (drop-file-tests f)
(printf "Drop File ~a\n" f)
(st #f f accept-drop-files)
(stv f accept-drop-files #t)
(st #t f accept-drop-files)
(stv f accept-drop-files #f)
(st #f f accept-drop-files))
(define (client->screen-tests f)
(printf "Client<->Screen ~a\n" f)
(send (or (send f get-parent) f) reflow-container)
(X-FAILS
(let-values ([(x y) (send f client->screen 0 0)])
(stvals '(0 0) f screen->client x y)))
(X-FAILS
(let-values ([(x y) (send f screen->client 0 0)])
(stvals '(0 0) f client->screen x y)))
(let-values ([(cw ch) (send f get-client-size)]
[(w h) (send f get-size)])
(test #t `(client-size ,f ,cw ,ch ,w ,h) (and (<= 1 cw w) (<= 1 ch h))))
(stv f refresh))
(define (area-tests f sw? sh? no-stretch? use-client-size?)
(printf "Area ~a\n" f)
(let ([x (send f min-width)]
[y (send f min-height)])
(st sw? f stretchable-width)
(st sh? f stretchable-height)
(stv (send f get-top-level-window) reflow-container)
(pause) ; to make sure size has taken effect
(let-values ([(w h) (if no-stretch?
(if use-client-size?
(send f get-client-size)
(send f get-size))
(values 0 0))])
(printf "Size ~a x ~a\n" w h)
(when no-stretch?
(stv f min-width w) ; when we turn of stretchability, don't resize
(stv f min-height h))
(stv f stretchable-width #f)
(stv f stretchable-height #f)
(st #f f stretchable-width)
(st #f f stretchable-height)
(stv f stretchable-width #t)
(stv f stretchable-height #t)
(st #t f stretchable-width)
(st #t f stretchable-height)
(stv f stretchable-width sw?)
(stv f stretchable-height sh?))
(stv f min-width x)
(stv f min-height y)))
(define (containee-tests f sw? sh? m)
(area-tests f sw? sh? #f #f)
(printf "Containee ~a\n" f)
(st m f horiz-margin)
(st m f vert-margin)
(stv f horiz-margin 3)
(st 3 f horiz-margin)
(st m f vert-margin)
(stv f horiz-margin m)
(stv f vert-margin 3)
(st m f horiz-margin)
(st 3 f vert-margin)
(stv f vert-margin m))
(define (container-tests f win?)
(printf "Container ~a\n" f)
(let-values ([(x y) (send f get-alignment)])
(stv f set-alignment 'right 'bottom)
(stvals '(right bottom) f get-alignment)
(stv f set-alignment x y)))
(define (cursor-tests f)
(printf "Cursor ~a\n" f)
(let ([c (send f get-cursor)])
(stv f set-cursor c)
(st c f get-cursor)
(begin-busy-cursor)
(end-busy-cursor)
(st c f get-cursor)
(stv f set-cursor #f)
(st #f f get-cursor)
(begin-busy-cursor)
(end-busy-cursor)
(st #f f get-cursor)
(stv f set-cursor c)))
(define (show-tests f)
(unless (is-a? f dialog%)
(printf "Show ~a\n" f)
(let ([on? (send f is-shown?)])
(stv f show #f)
(when on?
(stv f show #t)))))
(define (window-tests f sw? sh? parent top m)
(st parent f get-parent)
(st top f get-top-level-window)
(enable-tests f)
(drop-file-tests f)
(client->screen-tests f)
(cursor-tests f)
(show-tests f))
(define (containee-window-tests f sw? sh? parent top m)
(window-tests f sw? sh? parent top m)
(containee-tests f sw? sh? m))
(define (test-control-event e types)
(test #t 'event-instance (is-a? e control-event%))
(test #t 'event-type (pair? (memq (send e get-event-type) types))))
(define (label-test b l)
(let ([&-l (format "&~a" l)]
[my-l (format "My ~a" l)]
[&-my-l (format "&My ~a" l)]
[my-l-& (format "My ~a (&X) " l)])
(st &-l b get-label)
(st l b get-plain-label)
(stv b set-label &-my-l)
(st &-my-l b get-label)
(st my-l b get-plain-label)
(stv b set-label my-l-&)
(st my-l-& b get-label)
(st my-l b get-plain-label)
(stv b set-label &-l)))
(let ([f (make-object frame% "Yes & No" #f 150 151 70 21)])
(let ([init-tests
(lambda (hidden?)
(st "Yes & No" f get-label)
(st "Yes No" f get-plain-label)
(stv f set-label "Yeah & Nay")
(st "Yeah & Nay" f get-label)
(st "Yeah Nay" f get-plain-label)
(stv f set-label "Yes & No")
(st #f f get-parent)
(st f f get-top-level-window)
(X-FAILS (st 70 f get-x))
(X-FAILS (st 21 f get-y))
(X-FAILS (st 150 f get-width))
(X-FAILS (st 151 f get-height))
(X-FAILS (stvals (list (send f get-width) (send f get-height)) f get-size))
(st #f f has-status-line?)
(st #f f is-iconized?)
(st #f f get-menu-bar))]
[space-tests
(lambda ()
(printf "Spacing\n")
(let ([b (send f border)])
(stv f border 25)
(st 25 f border)
(stv f border b))
(let ([s (send f spacing)])
(stv f spacing 7)
(st 7 f spacing)
(stv f spacing s)))]
[enable-tests
(lambda () (enable-tests f))]
[drop-file-tests
(lambda ()
(drop-file-tests f))]
[client->screen-tests
(lambda ()
(printf "Client<->Screen\n")
(X-FAILS
(let-values ([(x y) (send f client->screen 0 0)])
(stvals '(0 0) f screen->client x y)))
(X-FAILS
(let-values ([(x y) (send f screen->client 0 0)])
(stvals '(0 0) f client->screen x y))))]
[container-tests
(lambda ()
(printf "Container\n")
(area-tests f #t #t #t #t)
(let-values ([(x y) (send f container-size null)])
(st x f min-width)
(st y f min-height))
(container-tests f #t))]
[cursor-tests
(lambda ()
(test #t 'get-cursor-kind (is-a? (send f get-cursor) cursor%))
(cursor-tests f))])
(st (current-eventspace) f get-eventspace)
(st #t f can-close?)
(st #t f can-exit?)
(stv f focus)
(space-tests)
(enable-tests)
(client->screen-tests)
(container-tests)
(cursor-tests)
(printf "Init\n")
(init-tests #f)
(stv f show #t)
(pause)
(printf "Show Init\n")
(init-tests #t)
(stv f show #f)
(pause)
(printf "Hide Init\n")
(init-tests #f)
(send f show #t)
(pause)
(space-tests)
(enable-tests)
(client->screen-tests)
(container-tests)
(stv f change-children values)
(printf "Iconize\n")
(stv f iconize #t)
(iconize-pause)
(X-FAILS (st #t f is-iconized?))
(stv f iconize #f)
(iconize-pause)
(X-FAILS (st #f f is-iconized?))
(stv f iconize #t)
(iconize-pause)
(X-FAILS (st #t f is-iconized?))
(stv f show #t)
(iconize-pause)
(X-FAILS (st #f f is-iconized?))
(stv f maximize #t)
(pause)
(stv f maximize #f)
(pause)
(printf "Move\n")
(stv f move 34 37)
(pause)
(X-FAILS (st 34 f get-x))
(X-FAILS (st 37 f get-y))
(X-FAILS (st 150 f get-width))
(X-FAILS (st 151 f get-height))
(printf "Resize\n")
(stv f resize 156 57)
(pause)
(X-FAILS (st 34 f get-x))
(X-FAILS (st 37 f get-y))
(X-FAILS (st 156 f get-width))
(X-FAILS (st 57 f get-height))
(stv f center)
(pause)
(X-FAILS (st 156 f get-width))
(X-FAILS (st 57 f get-height))
(client->screen-tests)
(stv f create-status-line)
(stv f set-status-text "Hello")
(stv f change-children values)
(st null f get-children)
(stvals '(center top) f get-alignment)
(stv f focus)
(cursor-tests)
(printf "Menu Bar\n")
(let ([mb (make-object menu-bar% f)])
(st mb f get-menu-bar)
(st f mb get-frame)
(st null f get-children)
(st #t mb is-enabled?)
(stv mb enable #f)
(st #f mb is-enabled?)
(stv mb enable #t)
(st #t mb is-enabled?)
(st null mb get-items)
(printf "Menu 1\n")
(let* ([m (make-object menu% "&File" mb)]
[i m]
[delete-enable-test (lambda (i parent empty)
(printf "Item\n")
(st #f i is-deleted?)
(st #t i is-enabled?)
(stv i delete)
(st #t i is-deleted?)
(st empty parent get-items)
(stv i restore)
(st #f i is-deleted?)
(stv i enable #f)
(st #f i is-enabled?)
(stv i enable #t)
(st #t i is-enabled?)
(stv i delete)
(st #t i is-enabled?)
(stv i enable #f)
(st #f i is-enabled?)
(stv i restore)
(st #f i is-deleted?)
(st #f i is-enabled?)
(stv i enable #t)
(let ([l (send i get-help-string)])
(stv i set-help-string "Yikes")
(st "Yikes" i get-help-string)
(stv i set-help-string #f)
(st #f i get-help-string)
(stv i set-help-string l))
(let ([l (send i get-label)])
(stv i set-label "Matthew")
(st "Matthew" i get-label)
(stv i set-label l)))]
[hit #f])
(st (list i) mb get-items)
(st mb i get-parent)
(st "&File" i get-label)
(st "File" i get-plain-label)
(st #f i get-help-string)
(delete-enable-test i mb null)
(st null m get-items)
(printf "Menu Items\n")
(let ([i1 (make-object menu-item% "&Plain" m
(lambda (i e)
(test-control-event e '(menu))
(test hit 'expected-plain-menu i)
(set! hit 'plain)
'oops)
#f "Help")]
[i2 (make-object separator-menu-item% m)]
[i3 (make-object checkable-menu-item% "Che&ckable" m
(lambda (i e)
(test-control-event e '(menu))
(test hit 'expected-check-menu i)
(set! hit 'check)
'oops)
#\C)]
[shortcut-test
(lambda (i empty name)
(delete-enable-test i m empty)
(printf "Shortcut\n")
(set! hit i)
(stv i command (make-object control-event% 'menu))
(test name 'hit-command hit)
(let ([c (send i get-shortcut)])
(stv i set-shortcut #\M)
(st #\M i get-shortcut)
(stv i set-shortcut #f)
(st #f i get-shortcut)
(stv i set-shortcut c))
(st (get-default-shortcut-prefix) i get-shortcut-prefix)
(let ([p (send i get-shortcut-prefix)])
(stv i set-shortcut-prefix '(shift))
(st '(shift) i get-shortcut-prefix)
(stv i set-shortcut-prefix '(ctl))
(st '(ctl) i get-shortcut-prefix)
(stv i set-shortcut-prefix '(shift ctl))
(st '(shift ctl) i get-shortcut-prefix)
(stv i set-shortcut-prefix p)))])
(st (list i1 i2 i3) m get-items)
(st "&Plain" i1 get-label)
(st "Plain" i1 get-plain-label)
(st "Help" i1 get-help-string)
(st #f i1 get-shortcut)
(st "Che&ckable" i3 get-label)
(st "Checkable" i3 get-plain-label)
(st #f i3 get-help-string)
(st #\C i3 get-shortcut)
(shortcut-test i1 (list i2 i3) 'plain)
(shortcut-test i3 (list i2 i1) 'check)
(st (list i2 i1 i3) m get-items)
(stv i2 delete)
(st #t i2 is-deleted?)
(st (list i1 i3) m get-items)
(stv i2 restore)
(st #f i2 is-deleted?)
(st (list i1 i3 i2) m get-items)
'done)
(printf "Menu 2\n")
(let* ([m2 (make-object menu% "&Edit" mb "Help Edit")]
[i2 m2])
(st (list i i2) mb get-items)
(st mb i2 get-parent)
(st "&Edit" i2 get-label)
(st "Edit" i2 get-plain-label)
(st "Help Edit" i2 get-help-string)
(delete-enable-test i2 mb (list i))
(st null m2 get-items)
; Move orig to end
(stv i delete)
(stv i restore)
(st (list i2 i) mb get-items)))
'done)))
(define frame (let ([l (get-top-level-windows)])
(test 1 'list-size (length l))
(car l)))
(st "Yes & No" frame get-label)
(send frame show #f)
(define (test-controls parent frame)
(define side-effect #f)
(printf "Buttons\n")
(letrec ([b (make-object button%
"&Button"
parent
(lambda (bt e)
(test bt 'same-button b)
(test-control-event e '(button))
(set! side-effect 'button)
'oops)
'(border))])
(label-test b "Button")
(stv b command (make-object control-event% 'button))
(test 'button 'button-callback side-effect)
(containee-window-tests b #f #f parent frame 2))
(printf "Check Box\n")
(letrec ([c (make-object check-box%
"&Check Box"
parent
(lambda (cb e)
(test cb 'same-check c)
(test-control-event e '(check-box))
(set! side-effect 'check-box)
'oops)
null)])
(label-test c "Check Box")
(stv c command (make-object control-event% 'check-box))
(test 'check-box 'check-box-callback side-effect)
(st #f c get-value)
(stv c set-value #t)
(st #t c get-value)
(stv c set-value #f)
(st #f c get-value)
(containee-window-tests c #f #f parent frame 2))
(let ([c (make-object check-box% "True"
parent void
null
#t)])
(st #t c get-value))
(printf "Radio Box\n")
(letrec ([r (make-object radio-box%
"&Radio Box"
(list "O&ne" "T&wo" "T&hree")
parent
(lambda (rb e)
(test rb 'same-radio r)
(test-control-event e '(radio-box))
(set! side-effect 'radio-box)
'oops)
'(vertical))])
(label-test r "Radio Box")
(stv r command (make-object control-event% 'radio-box))
(test 'radio-box 'radio-box-callback side-effect)
; Try every combination of enable states:
(let ([try-all
(lambda ()
(let loop ([n 7])
(let ([0? (positive? (bitwise-and n 1))]
[1? (positive? (bitwise-and n 2))]
[2? (positive? (bitwise-and n 4))])
(st 0? r is-enabled? 0)
(st 1? r is-enabled? 1)
(st 2? r is-enabled? 2)
(let ([0? (positive? (bitwise-and (sub1 n) 1))]
[1? (positive? (bitwise-and (sub1 n) 2))]
[2? (positive? (bitwise-and (sub1 n) 4))])
(stv r enable 0 0?)
(stv r enable 1 1?)
(stv r enable 2 2?)
(unless (zero? n)
(loop (sub1 n))))))
(st #t r is-enabled? 0)
(st #t r is-enabled? 1)
(st #t r is-enabled? 2))])
(try-all)
(stv r enable #f)
(try-all)
(stv r enable #t))
(st "O&ne" r get-item-label 0)
(st "T&wo" r get-item-label 1)
(st "T&hree" r get-item-label 2)
(st "One" r get-item-plain-label 0)
(st "Two" r get-item-plain-label 1)
(st "Three" r get-item-plain-label 2)
(st 3 r get-number)
(st 0 r get-selection)
(stv r set-selection 1)
(st 1 r get-selection)
(stv r set-selection 2)
(st 2 r get-selection)
(stv r set-selection 1)
(st 1 r get-selection)
(stv r set-selection 0)
(st 0 r get-selection)
(containee-window-tests r #f #f parent frame 2))
(letrec ([r (make-object radio-box%"Radio Two"
(list "O&ne" "T&wo" "T&hree")
parent
void
'(vertical)
2)])
(st 2 r get-selection))
(mismatch (make-object radio-box%"Radio Two"
(list "O&ne" "T&wo" "T&hree")
parent
void
'(vertical)
3))
(printf "Gauge\n")
(letrec ([g (make-object gauge%
"&Gauge"
10
parent
'(horizontal))])
(label-test g "Gauge")
(st 0 g get-value)
(stv g set-value 8)
(st 8 g get-value)
(stv g set-value 0)
(st 0 g get-value)
(stv g set-value 10)
(st 10 g get-value)
(st 10 g get-range)
(stv g set-range 11)
(st 11 g get-range)
(st 10 g get-value)
(stv g set-range 8)
(st 8 g get-range)
(st 8 g get-value)
(stv g set-range 1)
(st 1 g get-range)
(st 1 g get-value)
(stv g set-range 10)
(st 10 g get-range)
(st 1 g get-value)
(stv g set-range 100011)
(stv g set-value 100010)
(containee-window-tests g #t #f parent frame 2))
(printf "Slider\n")
(mismatch
(new slider% [parent parent] [label #f] [min-value 10] [max-value 9]))
(mismatch
(new slider% [parent parent] [label #f] [min-value 10] [max-value 11] [init-value 12]))
(letrec ([s (make-object slider%
"&Slider"
-2 8
parent
(lambda (sl e)
(test sl 'same-slider s)
(test-control-event e '(slider))
(set! side-effect 'slider)
'oops)
3
'(horizontal))])
(label-test s "Slider")
(stv s command (make-object control-event% 'slider))
(test 'slider 'slider-callback side-effect)
(st 3 s get-value)
(stv s set-value 4)
(st 4 s get-value)
(stv s set-value -2)
(st -2 s get-value)
(stv s set-value 8)
(st 8 s get-value)
(containee-window-tests s #t #f parent frame 2))
(let ([test-list-control
(lambda (l choice? multi?)
(st 3 l get-number)
(st "A" l get-string 0)
(st "B" l get-string 1)
(st "C & D" l get-string 2)
(unless choice?
(st 'a l get-data 0)
(st #f l get-data 1)
(st 'c-&-d l get-data 2))
(st 0 l find-string "A")
(st 1 l find-string "B")
(st 2 l find-string "C & D")
(st #f l find-string "C")
(stv l set-selection 2)
(st 2 l get-selection)
(st "C & D" l get-string-selection)
(stv l set-selection 1)
(st 1 l get-selection)
(st "B" l get-string-selection)
(stv l set-selection 0)
(st 0 l get-selection)
(st "A" l get-string-selection)
(stv l set-string-selection "C & D")
(st 2 l get-selection)
(st "C & D" l get-string-selection)
(stv l set-string-selection "B")
(st 1 l get-selection)
(st "B" l get-string-selection)
(stv l set-string-selection "A")
(st 0 l get-selection)
(st "A" l get-string-selection)
(stv l set-selection 2)
(unless choice?
(st '(2) l get-selections)
(stv l set-selection 1)
(st #t l is-selected? 1)
(st #f l is-selected? 2)
(st '(1) l get-selections)
(stv l set-selection 2)
(st #f l is-selected? 1)
(st #t l is-selected? 2)
(stv l select 2 #f)
(st '() l get-selections)
(st #f l get-selection)
(stv l select 0 #t)
(st '(0) l get-selections)
(stv l select 2 #t)
(st (if multi? '(0 2) '(2)) l get-selections)
(stv l select 1 #t)
(st (if multi? '(0 1 2) '(1)) l get-selections)
(stv l select 1 #f)
(st (if multi? '(0 2) '()) l get-selections)
(st (if multi? 0 #f) l get-selection)
(stv l select 2 #t)
(st (if multi? '(0 2) '(2)) l get-selections)
(st (if multi? 0 2) l get-selection)
(st multi? l is-selected? 0)
(st #t l is-selected? 2)
(stv l set-selection 2)
(st '(2) l get-selections))
(if choice?
(stv l append "E")
(stv l append "E" 'e))
(st 4 l get-number)
(st 2 l get-selection)
(unless choice?
(st 'e l get-data 3))
(stv l append "F & G")
(st 5 l get-number)
(st 2 l get-selection)
(unless choice?
(st #f l get-data 4))
(stv l set-selection 4)
(st 4 l get-selection)
(st "F & G" l get-string-selection)
(stv l set-selection 2)
(stv l set-string-selection "F & G")
(st 4 l get-selection)
(st "F & G" l get-string-selection)
(unless choice?
(stv l delete 1)
(st 4 l get-number)
(st "A" l get-string 0)
(st 'a l get-data 0)
(st "C & D" l get-string 1)
(st 'c-&-d l get-data 1)
(stv l delete 0)
(st 3 l get-number))
(stv l clear)
(st 0 l get-number)
(st #f l get-selection)
(st #f l get-string-selection)
(stv l append "Z")
(st 1 l get-number)
(when choice?
(st 0 l get-selection)
(st "Z" l get-string-selection))
(unless choice?
(st 1 l get-number)
(stv l set '("ONe" "TW&o" "THRee"))
(st 3 l get-number)
(st "ONe" l get-string 0)
(st "TW&o" l get-string 1)
(st "THRee" l get-string 2)
(stv l set-data 0 'my-example-data)
(stv l set-data 2 'my-other-data)
(st 'my-example-data l get-data 0)
(st #f l get-data 1)
(st 'my-other-data l get-data 2))
'done-list)])
(printf "Choice\n")
(letrec ([c (make-object choice%
"&Choice"
'("A" "B" "C & D")
parent
(lambda (ch e)
(test ch 'same-choice c)
(test-control-event e '(choice))
(set! side-effect 'choice)
'oops)
null)])
(label-test c "Choice")
(stv c command (make-object control-event% 'choice))
(test 'choice 'choice-callback side-effect)
(st 0 c get-selection)
(test-list-control c #t #f)
(containee-window-tests c #f #f parent frame 2))
(letrec ([c (make-object choice% "Choice 2"
'("A" "B" "C & D")
parent void
null
2)])
(st 2 c get-selection))
(mismatch (make-object choice% "Choice 2"
'("A" "B" "C & D")
parent void
null
3))
(let ([mk-list
(lambda (style)
(printf "List Box: ~a\n" style)
(letrec ([l (make-object list-box%
"&List Box"
'("A" "B" "C & D")
parent
(lambda (lb e)
(test lb 'same-list-box l)
(test-control-event e '(list-box))
(set! side-effect 'list-box)
'oops)
style)])
(label-test l "List Box")
(stv l command (make-object control-event% 'list-box))
(test 'list-box 'list-box-callback side-effect)
(stv l set-data 0 'a)
(stv l set-data 2 'c-&-d)
(test-list-control l #f (and (or (memq 'multiple style)
(memq 'extended style))
#t))
(containee-window-tests l #t #t parent frame 2)
(st '("Column") l get-column-labels)
(st '(0) l get-column-order)
(let ([check-col-width
(lambda (col)
(let-values ([(val lo hi) (send l get-column-width col)])
(test #t 'col-width (<= 0 lo val hi 10000))))])
(check-col-width 0)
(when (memq 'variable-columns style)
(stv l append-column "Second")
(st '("Column" "Second") l get-column-labels)
(st '(0 1) l get-column-order)
(stv l set-column-order '(1 0))
(st '(1 0) l get-column-order)
(stv l set-string 0 "A2" 1)
(check-col-width 1)
(stv l append-column "Three")
(check-col-width 2)
(st '("Column" "Second" "Three") l get-column-labels)
(st '(1 0 2) l get-column-order)
(stv l delete-column 1)
(st '("Column" "Three") l get-column-labels)
(st '(0 1) l get-column-order)))
(stv parent delete-child l)))])
(mk-list '(single))
(mk-list '(multiple))
(mk-list '(extended))
(mk-list '(single variable-columns)))
'done-lists)
(let ([l (make-object list-box% "List Two"
'("A" "B" "C & D")
parent
void
(list 'single)
2)])
(st 2 l get-selection))
(mismatch (make-object list-box% "List Two"
'("A" "B" "C & D")
parent
void
(list 'single)
3))
(let loop ([styles '((single) (multiple) (multiple hscroll))])
(unless (null? styles)
(let ([t (make-object text-field% "Label" parent void "Starting Value" (car styles))])
(st "Starting Value" t get-value)
(stv t set-value "different")
(st "different" t get-value)
(test #t 'is-editor? (is-a? (send t get-editor) text%))
(containee-window-tests t #t
(and (memq 'multiple (car styles)) #t)
parent frame 2)
(send parent delete-child t)
(loop (cdr styles)))))
(define (check-canvas-no-scroll c)
(st 0 c get-scroll-range 'vertical)
(st 0 c get-scroll-range 'horizontal)
(st 0 c get-scroll-page 'vertical)
(st 0 c get-scroll-page 'horizontal)
(st 0 c get-scroll-pos 'vertical)
(st 0 c get-scroll-pos 'horizontal))
(let ([c (make-object canvas% parent '())])
(check-canvas-no-scroll c)
(stv c init-manual-scrollbars 5 6 2 3 4 5)
(check-canvas-no-scroll c))
(let ([c (make-object canvas% parent '(hscroll vscroll))])
(printf "Tab Focus\n")
(st #f c accept-tab-focus)
(stv c accept-tab-focus #t)
(st #t c accept-tab-focus)
(stv c accept-tab-focus #f)
(st #f c accept-tab-focus)
(check-canvas-no-scroll c)
(stv c init-auto-scrollbars 500 606 .02 .033)
; (stv c set-scrollbars 100 101 5 6 2 3 10 20 #t)
(let-values ([(w h) (send c get-virtual-size)]
[(cw ch) (send c get-client-size)])
(printf "Canvas size: Virtual: ~a x ~a Client: ~a x ~a\n" w h cw ch)
(let ([check-scroll
(lambda (xpos ypos)
(let-values ([(x y) (send c get-view-start)])
(let ([coerce (lambda (x) (inexact->exact (floor x)))])
(test (coerce (* xpos (- 500 cw))) `(canvas-view-x ,xpos ,ypos ,x ,cw ,w) x)
(test (coerce (* ypos (- 606 ch))) `(canvas-view-y ,xpos ,ypos ,y ,ch , h) y))))])
(test 500 'canvas-virt-w-size w)
(test 606 'canvas-virt-h-size h)
(check-scroll 0.02 0.033)
(st 0 c get-scroll-pos 'horizontal)
(st 0 c get-scroll-pos 'vertical)
(st 0 c get-scroll-page 'horizontal)
(st 0 c get-scroll-page 'vertical)
(st 0 c get-scroll-range 'horizontal)
(st 0 c get-scroll-range 'vertical)
(stv c scroll 0.1 0.1)
(check-scroll 0.1 0.1)
(stv c scroll #f 0.2)
(check-scroll 0.1 0.2)
(stv c scroll 0.0 #f)
(check-scroll 0.0 0.2)
'done-sb))
(stv c init-manual-scrollbars 5 6 2 3 4 5)
(let-values ([(w h) (send c get-virtual-size)]
[(cw ch) (send c get-client-size)])
(let ([check-scroll
(lambda (xpos ypos)
(st xpos c get-scroll-pos 'horizontal)
(st ypos c get-scroll-pos 'vertical)
(test cw 'canvas-virt-w-size w)
(test ch 'canvas-virt-h-size h)
(let-values ([(x y) (send c get-view-start)])
(test 0 'canvas-view-x x)
(test 0 'canvas-view-y y)))])
(check-scroll 4 5)
(st 2 c get-scroll-page 'horizontal)
(st 3 c get-scroll-page 'vertical)
(st 5 c get-scroll-range 'horizontal)
(st 6 c get-scroll-range 'vertical)
(stv c scroll 1 1)
(check-scroll 4 5)
(stv c set-scroll-pos 'horizontal 1)
(check-scroll 1 5)
(stv c set-scroll-pos 'vertical 0)
(check-scroll 1 0)
(stv c set-scroll-page 'horizontal 1)
(st 1 c get-scroll-page 'horizontal)
(st 3 c get-scroll-page 'vertical)
(stv c set-scroll-page 'vertical 2)
(st 1 c get-scroll-page 'horizontal)
(st 2 c get-scroll-page 'vertical)
'done-sb))
(stv c init-manual-scrollbars 1000000 1000000 999999 999999 4 5)
(stv c warp-pointer 21 23)
(containee-window-tests c #t #t parent frame 0))
(let* ([e (make-object text%)]
[c (make-object editor-canvas%
parent e
null
102)])
(let loop ([n 100])
(unless (zero? n)
(send e insert (format "line ~a\n" n))
(loop (sub1 n))))
(st #f c allow-scroll-to-last)
(stv c allow-scroll-to-last #t)
(st #t c allow-scroll-to-last)
(stv c allow-scroll-to-last #f)
(st 'hello c call-as-primary-owner (lambda () 'hello))
(st #f c force-display-focus)
(stv c force-display-focus #t)
(st #t c force-display-focus)
(stv c force-display-focus #f)
(st e c get-editor)
(stv c set-editor #f)
(st #f c get-editor)
(stv c set-editor e)
(st e c get-editor)
(st #f c lazy-refresh)
(stv c lazy-refresh #t)
(st #t c lazy-refresh)
(stv c lazy-refresh #f)
(st #f c scroll-with-bottom-base)
(stv c scroll-with-bottom-base #t)
(st #t c scroll-with-bottom-base)
(stv c scroll-with-bottom-base #f)
(stv c set-line-count 6)
(stv c set-line-count #f)
(containee-window-tests c #t #t parent frame 0))
'done)
(test-controls frame frame)
(define (panel-tests frame% show? #:shorter? [shorter? shorter?])
(define (panel-test % win?
#:choices? [choices? #f]
#:label? [label? #f]
#:margin [m 0]
#:style [style '()])
(let* ([frame (make-object frame% "Panel Test" #f 100 100)]
[panel (if %
(cond
[choices?
(new % [parent frame] [choices '("A" "B")] [style style])]
[label?
(new % [parent frame] [label "Stuff"])]
[else (new % [parent frame])])
frame)])
(let ([go
(lambda ()
(test-controls panel frame)
(if win?
((if % containee-window-tests window-tests) panel #t #t (and % frame) frame m)
(area-tests panel #t #t #f #f))
(when (is-a? panel panel%)
(st (is-a? panel horizontal-panel%) panel get-orientation))
(container-tests panel win?)
(send frame show #f))])
(when (eq? show? 'dialog)
(queue-callback go))
(when show?
(send frame show #t))
(unless (eq? show? 'dialog)
(go)))))
(panel-test #f #t)
(unless shorter?
(panel-test vertical-pane% #f)
(panel-test horizontal-pane% #f)
(panel-test vertical-panel% #t)
(panel-test horizontal-panel% #t)
(panel-test tab-panel% #t #:choices? #t))
(panel-test tab-panel% #t #:choices? #t #:style '(no-border))
(panel-test group-box-panel% #t #:label? #t #:margin 2))
(panel-tests dialog% #f)
(panel-tests frame% #t #:shorter? #f)
(panel-tests frame% #f)
(panel-tests dialog% 'dialog)
(let ([e (make-object mouse-event%
'motion
#t ; left
#f ; middle
#f ; right
11 ; x
33 ; y
#t ; shift
#f ; control
#t ; meta
#f ; alt
13 ; timestamp
#f ; caps
#t ; mod3
#f ; mod4
#t ; mod5
)])
(st 'motion e get-event-type)
(st #t e get-left-down)
(st #f e get-middle-down)
(st #f e get-right-down)
(st 11 e get-x)
(st 33 e get-y)
(st #t e get-shift-down)
(st #f e get-control-down)
(st #t e get-meta-down)
(st #f e get-alt-down)
(st 13 e get-time-stamp)
(st #f e get-caps-down)
(st #t e get-mod3-down)
(st #f e get-mod4-down)
(st #t e get-mod5-down))
(let ([e (make-object key-event%
#\x
#t ; shift
#f ; control
#t ; meta
#f ; alt
11 ; x
33 ; y
13 ; timestamp
#f ; caps
#t ; mod3
#f ; mod4
#t ; mod5
)])
(st #\x e get-key-code)
(st 'press e get-key-release-code)
(st 11 e get-x)
(st 33 e get-y)
(st #t e get-shift-down)
(st #f e get-control-down)
(st #t e get-meta-down)
(st #f e get-alt-down)
(st 13 e get-time-stamp)
(st #f e get-caps-down)
(st #t e get-mod3-down)
(st #f e get-mod4-down)
(st #t e get-mod5-down))
(report-errs)