racket/collects/tests/deinprogramm/image.rkt
Eli Barzilay 672910f27b Lots of bad TAB eliminations.
I started from tabs that are not on the beginning of lines, and in
several places I did further cleanings.

If you're worried about knowing who wrote some code, for example, if you
get to this commit in "git blame", then note that you can use the "-w"
flag in many git commands to ignore whitespaces.  For example, to see
per-line authors, use "git blame -w <file>".  Another example: to see
the (*much* smaller) non-whitespace changes in this (or any other)
commit, use "git log -p -w -1 <sha1>".
2012-11-07 11:22:20 -05:00

1034 lines
35 KiB
Racket

#lang scheme/base
(provide all-image-tests)
(require rackunit
deinprogramm/image
(only-in lang/private/imageeq image=?)
(except-in mred make-color make-pen)
mzlib/class
mrlib/cache-image-snip
lang/posn
htdp/error)
(define-values (image-snip1 image-snip2)
(let ()
(define size 2)
(define (do-draw c-bm m-bm)
(let ([bdc (make-object bitmap-dc% c-bm)])
(send bdc clear)
(send bdc set-pen (send the-pen-list find-or-create-pen "black" 1 'transparent))
(send bdc set-brush (send the-brush-list find-or-create-brush "red" 'solid))
(send bdc draw-rectangle 0 0 size size)
(send bdc set-bitmap m-bm)
(send bdc clear)
(send bdc set-pen (send the-pen-list find-or-create-pen "black" 1 'transparent))
(send bdc set-brush (send the-brush-list find-or-create-brush "black" 'solid))
(send bdc draw-rectangle 0 0 (/ size 2) size)
(send bdc set-bitmap #f)))
(define image-snip1
(let* ([c-bm (make-object bitmap% size size)]
[m-bm (make-object bitmap% size size #t)])
(do-draw c-bm m-bm)
(make-object image-snip% c-bm m-bm)))
(define image-snip2
(let* ([c-bm (make-object bitmap% size size)]
[m-bm (make-object bitmap% size size)])
(do-draw c-bm m-bm)
(send c-bm set-loaded-mask m-bm)
(make-object image-snip% c-bm)))
(values image-snip1 image-snip2)))
(define image-snip3 (make-object image-snip%))
;; check-on-bitmap : symbol snip -> void
;; checks on various aspects of the bitmap snips to make
;; sure that they draw properly
(define (check-on-bitmap snp)
(let-values ([(width height) (send snp get-size)])
(let ([bdc (make-object bitmap-dc%)]
[max-difference
(lambda (s1 s2)
(cond
[(and (zero? (bytes-length s1))
(zero? (bytes-length s2)))
0]
[else
(apply max
(map (lambda (x y) (abs (- x y)))
(bytes->list s1)
(bytes->list s1)))]))])
;; test that no drawing is outside the snip's drawing claimed drawing area
(let* ([extra-space 100]
[bm-width (+ width extra-space)]
[bm-height (+ height extra-space)]
[bm-clip (make-object bitmap% bm-width bm-height)]
[bm-noclip (make-object bitmap% bm-width bm-height)]
[s-clip (make-bytes (* bm-width bm-height 4))]
[s-noclip (make-bytes (* bm-width bm-height 4))]
[s-trunc (make-bytes (* bm-width bm-height 4))])
(send bdc set-bitmap bm-clip)
(send bdc clear)
(send bdc set-clipping-rect (/ extra-space 2) (/ extra-space 2) width height)
(send snp draw bdc (/ extra-space 2) (/ extra-space 2) 0 0 (+ width extra-space) (+ height extra-space) 0 0 #f)
(send bdc set-clipping-region #f)
(send bdc get-argb-pixels 0 0 (+ width extra-space) (+ height extra-space) s-clip)
(send bdc set-bitmap bm-noclip)
(send bdc clear)
(send snp draw bdc (/ extra-space 2) (/ extra-space 2) 0 0 (+ width extra-space) (+ height extra-space) 0 0 #f)
(send bdc get-argb-pixels 0 0 (+ width extra-space) (+ height extra-space) s-noclip)
(send bdc set-bitmap #f)
(check-equal? s-clip s-noclip)
(send bdc set-bitmap bm-noclip)
(send bdc set-pen "black" 1 'transparent)
(send bdc set-brush "white" 'solid)
(send bdc draw-rectangle 0 0 (/ extra-space 2) bm-height)
(send bdc draw-rectangle (- bm-width (/ extra-space 2)) 0 (/ extra-space 2) bm-height)
(send bdc draw-rectangle 0 0 bm-width (/ extra-space 2))
(send bdc draw-rectangle 0 (- bm-height (/ extra-space 2)) bm-width (/ extra-space 2))
(send bdc get-argb-pixels 0 0 (+ width extra-space) (+ height extra-space) s-trunc)
(check-equal? s-noclip s-trunc))
(let ([bm-normal (make-object bitmap% (max 1 width) (max 1 height))]
[bm-bitmap (make-object bitmap% (max 1 width) (max 1 height))]
[s-normal (make-bytes (* (max 1 width) (max 1 height) 4))]
[s-bitmap (make-bytes (* (max 1 width) (max 1 height) 4))])
(send bdc set-bitmap bm-normal)
(send bdc clear)
(send snp draw bdc 0 0 0 0 width height 0 0 #f)
(send bdc get-argb-pixels 0 0 width height s-normal)
(send bdc set-bitmap bm-bitmap)
(send bdc clear)
;; force the snip to switch over to bitmap mode
(send snp get-argb)
(send snp draw bdc 0 0 0 0 width height 0 0 #f)
(send bdc get-argb-pixels 0 0 width height s-bitmap)
(send bdc set-bitmap #f)
(check-true (<= (max-difference s-normal s-bitmap) 2))))))
(define red (make-color 255 0 0))
(define blue (make-color 0 0 255))
(define black (make-color 0 0 0))
(define white (make-color 255 255 255))
(define awhite (make-alpha-color 0 255 255 255))
(define ablack (make-alpha-color 0 0 0 0))
(define ared (make-alpha-color 0 255 0 0))
(define aclr (make-alpha-color 255 0 0 0))
(define-simple-check (check-image=? i1 i2)
(image=? i1 i2))
(define-simple-check (check-not-image=? i1 i2)
(not (image=? i1 i2)))
(define-simple-check (check-terminates val1)
#t)
(define (add-line i x1 y1 x2 y2 color)
(overlay i
(line (image-width i)
(image-height i)
x1 y1 x2 y2 color)
"left" "top"))
(define (not-image-inside? i1 i2)
(not (image-inside? i1 i2)))
;; tests that the expression
;; a) raises a teachpack exception record,
;; b) has the right argument position, and
;; c) has the right name.
(define (tp-exn-pred name position)
(lambda (exn)
(and (exn:fail:contract? exn)
(let* ([msg (exn-message exn)]
[beg (format "~a:" name)]
[len (string-length beg)])
(and (regexp-match position msg)
((string-length msg) . > . len)
(string=? (substring msg 0 len) beg))))))
(define-syntax err/rt-name-test
(syntax-rules ()
[(_ (name . args) position)
(check-exn (tp-exn-pred 'name position)
(lambda ()
(name . args)))]))
(define all-image-tests
(test-suite
"Tests for images"
(test-case
"image?"
(check-pred image? (rectangle 10 10 'solid 'blue))
(check-pred image? (rectangle 10 10 "solid" 'blue))
(check-pred image? (rectangle 10 10 'outline 'blue))
(check-pred image? (rectangle 10 10 "outline" 'blue))
(check-false (image? 5)))
(test-case
"color-list"
(check-equal? (list red)
(image->color-list (rectangle 1 1 'solid 'red)))
(check-equal? (list blue blue blue blue)
(image->color-list (rectangle 2 2 'solid 'blue))))
(test-case
"colors-set-up-properly"
(check-equal? (list (list red) (list blue) (list black) (list white))
(list (image->color-list (rectangle 1 1 'solid 'red))
(image->color-list (rectangle 1 1 'solid 'blue))
(image->color-list (rectangle 1 1 'solid 'black))
(image->color-list (rectangle 1 1 'solid 'white)))))
(test-case
"color-list2"
(check-equal? (list blue blue blue
blue blue blue
blue blue blue)
(image->color-list (rectangle 3 3 'solid 'blue)))
(check-equal? (list blue blue blue
blue blue blue
blue blue blue)
(image->color-list (rectangle 3 3 "solid" 'blue)))
(check-equal? (list blue blue blue
blue white blue
blue blue blue)
(image->color-list (rectangle 3 3 'outline 'blue))))
(test-case
"color-list3"
(check-equal? (list blue blue blue
blue white blue
blue blue blue)
(image->color-list (rectangle 3 3 "outline" 'blue))))
(test-case
"color-list4"
(check-image=? (color-list->image (list blue blue blue blue) 2 2)
(rectangle 2 2 'solid 'blue)))
(test-case
"color-list5"
(check-not-image=? (color-list->image (list blue blue blue blue) 2 2)
(rectangle 1 4 'solid 'blue)))
(test-case
"color-list6"
(check-image=? (color-list->image (list blue blue blue blue) 1 4)
(rectangle 1 4 'solid 'blue)))
(test-case
"color-list7"
(check-image=? (color-list->image (list 'blue 'blue 'blue 'blue) 2 2)
(rectangle 2 2 'solid 'blue)))
(test-case
"color-list8"
(check-equal? 10
(image-width (color-list->image '() 10 0))))
(test-case
"color-list9"
(check-equal? 0
(image-height (color-list->image '() 10 0))))
(test-case
"color-list10"
(check-equal? 0
(image-width (color-list->image '() 0 10))))
(test-case
"color-list11"
(check-equal? 10
(image-height (color-list->image '() 0 10))))
(test-case
"alpha-color-list1"
(check-equal? (make-alpha-color 0 255 0 0)
(car (image->alpha-color-list (rectangle 1 1 'solid 'red)))))
(test-case
"alpha-color-list2"
(check-equal? (make-alpha-color 0 255 0 0)
(car (image->alpha-color-list (rectangle 1 1 "solid" 'red)))))
(test-case
"alpha-color-list3"
(for-each
(lambda (x)
(check-equal? x (make-alpha-color 0 255 0 0)))
(image->alpha-color-list (rectangle 1 1 "solid" 'red))))
(test-case
"alpha-color-list4"
(for-each
(lambda (x)
(check-equal? x (make-alpha-color 0 255 0 0)))
(image->alpha-color-list (rectangle 1 1 'solid 'red))))
(test-case
"alpha-color-list5"
(check-equal? (make-alpha-color 0 0 255 0)
(car (image->alpha-color-list (rectangle 1 1 'solid 'green)))))
(test-case
"alpha-color-list6"
(check-equal? (make-alpha-color 0 0 0 255)
(car (image->alpha-color-list (rectangle 1 1 'solid 'blue)))))
(test-case
"alpha-color-list7"
(check-equal? (image-width
(alpha-color-list->image
(list ared aclr ared
aclr aclr aclr)
3
2))
3))
(test-case
"alpha-color-list8"
(check-equal? (image-height
(alpha-color-list->image
(list ared aclr ared
aclr aclr aclr)
3
2))
2))
(test-case
"alpha-color-list9"
(check-equal? (image->color-list
(alpha-color-list->image
(list ared aclr ared
aclr aclr aclr)
3 2))
(list red white red
white white white)))
(test-case
"alpha-color-list10"
(check-equal? (image->color-list
(overlay
(rectangle 3 3 'solid 'blue)
(alpha-color-list->image
(list ared aclr ared
aclr aclr aclr
ared aclr ared)
3 3)
"left" "top"))
(list red blue red
blue blue blue
red blue red)))
(test-case
"alpha-color-list11"
(check-equal? 10 (image-width (alpha-color-list->image '() 10 0))))
(test-case
"alpha-color-list12"
(check-equal? 0 (image-height (alpha-color-list->image '() 10 0))))
(test-case
"alpha-color-list13"
(check-equal? 0 (image-width (alpha-color-list->image '() 0 10))))
(test-case
"alpha-color-list14"
(check-equal? 10 (image-height (alpha-color-list->image '() 0 10))))
(test-case
"image=?1"
(check-image=? (alpha-color-list->image (list (make-alpha-color 200 100 150 175)) 1 1)
(alpha-color-list->image (list (make-alpha-color 200 100 150 175)) 1 1)))
(test-case
"image=?2"
(check-image=? (alpha-color-list->image (list (make-alpha-color 255 100 100 100)) 1 1)
(alpha-color-list->image (list (make-alpha-color 255 200 200 200)) 1 1)))
(test-case
"image=?3"
(check-not-image=? (alpha-color-list->image (list (make-alpha-color 200 100 100 100)) 1 1)
(alpha-color-list->image (list (make-alpha-color 200 200 200 200)) 1 1)))
(test-case
"image=?4"
(check-not-image=? (alpha-color-list->image (list (make-alpha-color 200 100 150 175)
(make-alpha-color 200 100 150 175))
1
2)
(alpha-color-list->image (list (make-alpha-color 200 100 150 175)
(make-alpha-color 200 100 150 175))
2
1)))
;; This one is broken because of a fundamental problem with the
;; image primitives.
#;(test-case
"image=?5"
(check-not-image=? (rectangle 4 4 'outline 'black)
(overlay
(rectangle 4 4 'outline 'black)
(circle 1 'solid 'red)
0 0)))
(test-case
"overlay"
(check-image=? (color-list->image (list blue red blue red) 2 2)
(overlay (rectangle 2 2 'solid 'red)
(rectangle 1 2 'solid 'blue)
"left" "top")))
(test-case
"overlay/multiple"
(check-image=? (overlay (rectangle 6 6 'solid 'red)
(overlay (rectangle 4 4 'solid 'white)
(rectangle 2 2 'solid 'blue)
"center" "center")
"center" "center")
(overlay (overlay (rectangle 6 6 'solid 'red)
(rectangle 4 4 'solid 'white)
"center" "center")
(rectangle 2 2 'solid 'blue)
"center" "center")))
(test-case
"overlay/empty-spaces-are-unmasked"
(check-image=? (color-list->image (list red red red blue) 2 2)
(overlay
(rectangle 2 2 'solid 'blue)
(overlay (rectangle 1 2 'solid 'red)
(rectangle 2 1 'solid 'red)
"left" "top")
"left" "top")))
(test-case
"overlay/xy1"
(check-image=? (color-list->image (list red blue red blue) 2 2)
(overlay (rectangle 2 2 'solid 'red)
(rectangle 1 2 'solid 'blue)
1 0)))
(test-case
"overlay/xy2"
(check-image=? (color-list->image (list red red red blue) 2 2)
(overlay (rectangle 2 2 'solid 'red)
(rectangle 1 1 'solid 'blue)
1 1)))
(test-case
"overlay/xy3"
(check-image=? (color-list->image (list red red blue blue) 2 2)
(overlay (rectangle 2 1 'solid 'red)
(rectangle 2 1 'solid 'blue)
0 1)))
(test-case
"overlay/xy/white"
(check-image=? (alpha-color-list->image (list ablack ablack ablack
ablack awhite ablack
ablack ablack ablack)
3 3)
(overlay (rectangle 3 3 'solid 'black)
(rectangle 1 1 'solid 'white)
1 1)))
(test-case
"color-list->image/white-in-mask"
(check-image=? (color-list->image (list black red black
red red red
black red black)
3 3)
(overlay (rectangle 3 3 'solid 'red)
(color-list->image (list black white black
white white white
black white black)
3 3)
"left" "top")))
(test-case
"overlay"
(check-image=? (color-list->image (list red blue red red blue red) 3 2)
(overlay (rectangle 3 2 'solid 'red)
(rectangle 1 2 'solid 'blue)
1 0)))
(test-case
"image=?-zero1"
(check-image=? (rectangle 0 10 'solid 'red)
(rectangle 0 10 'solid 'red)))
(test-case
"image=?-zero2"
(check-image=? (rectangle 0 10 'solid 'red)
(rectangle 0 10 'solid 'blue)))
(test-case
"image=?-zero3"
(check-not-image=? (rectangle 0 5 'solid 'red)
(rectangle 0 4'solid 'blue)))
(test-case
"image-inside?1"
(check image-inside?
(overlay (rectangle 3 2 'solid 'red)
(rectangle 1 2 'solid 'blue)
1 0)
(rectangle 1 2 'solid 'blue)))
(test-case
"image-inside?2"
(check not-image-inside?
(overlay (rectangle 3 2 'solid 'red)
(rectangle 1 2 'solid 'blue)
1 0)
(rectangle 1 2 'solid 'black)))
(test-case
"image-inside?3"
(check image-inside?
(overlay (rectangle 3 2 'solid 'red)
(rectangle 1 2 'solid 'blue)
1 0)
(rectangle 1 2 'solid 'red)))
(test-case
"image-inside?4"
(check not-image-inside?
(overlay (rectangle 3 2 'solid 'red)
(rectangle 1 2 'solid 'blue)
1 0)
(rectangle 2 1 'solid 'red)))
(test-case
"image-inside?5"
(check image-inside?
(alpha-color-list->image (list (make-alpha-color 0 255 0 0)) 1 1)
(alpha-color-list->image (list (make-alpha-color 255 0 0 0)) 1 1)))
(test-case
"image-inside?6"
(check not-image-inside?
(overlay (rectangle 3 2 'solid 'red)
(rectangle 1 2 'solid 'blue)
1 0)
(color-list->image (list blue white white)
3 1)))
(test-case
"image-inside?7"
(check image-inside?
(overlay (rectangle 16 16 'solid 'red)
(ellipse 6 6 'outline 'blue)
2 5)
(ellipse 6 6 'outline 'blue)))
(test-case
"image-inside?8"
(check image-inside?
(overlay (rectangle (image-width (text "x" 12 'red))
(image-height (text "x" 12 'red))
'solid
'white)
(text "x" 12 'red)
"center" "center")
(text "x" 12 'red)))
(test-case
"image-inside?9"
(check image-inside?
(text "y x y" 12 'red)
(text "x" 12 'red)))
(test-case
"find-image1"
(check-equal? (make-posn 2 5)
(find-image (overlay (rectangle 16 16 'solid 'red)
(ellipse 6 6 'outline 'blue)
2 5)
(ellipse 6 6 'outline 'blue))))
(test-case
"find-image2"
(check-equal? (make-posn 0 0)
(find-image (rectangle 16 16 'solid 'blue)
(ellipse 6 6 'outline 'blue))))
(test-case
"find-image3"
(check-equal? (make-posn 1 1)
(find-image (overlay (rectangle 10 10 'solid 'blue)
(ellipse 5 5 'solid 'red)
1 1)
(ellipse 5 5 'solid 'red))))
(test-case
"image-width"
(check-equal? 5 (image-width (rectangle 5 7 'solid 'red))))
(test-case
"image-height"
(check-equal? 7 (image-height (rectangle 5 7 'solid 'red))))
(test-case
"color-red"
(check-equal? 1 (color-red (make-color 1 2 3))))
(test-case
"color-green"
(check-equal? 2 (color-green (make-color 1 2 3))))
(test-case
"color-blue"
(check-equal? 3 (color-blue (make-color 1 2 3))))
(test-case
"color?1"
(check-true (color? (make-color 1 2 3))))
(test-case
"color?2"
(check-false (color? 10)))
(test-case
"image-color?1"
(check-pred image-color? (make-color 1 2 3)))
(test-case
"image-color?2"
(check-pred image-color? "blue"))
(test-case
"image-color?3"
(check-pred image-color? 'blue))
(test-case
"image-color?4"
(check-false (image-color? 10)))
(test-case
"image-color?5"
(check-false (image-color? "not-a-color")))
(test-case
"image-color?6"
(check-false (image-color? 'not-a-color)))
(test-case
"line"
(check image=?
(line 5 1 0 0 4 0 'red)
(color-list->image (list red red red red red) 5 1))
(check image=?
(line 1 5 0 0 0 4 'red)
(color-list->image (list red red red red red) 1 5))
(check image=?
(line 1 5 0 4 0 0 'red)
(color-list->image (list red red red red red) 1 5))
(check image=?
(line 5 1 4 0 0 0 'red)
(color-list->image (list red red red red red) 5 1)))
; note: next two tests may be platform-specific... I'm not sure.
;; I developed them under macos x. -robby
(test-case
"triangle1"
(check image=?
(triangle 3 'outline 'red)
(color-list->image
(list white red white
white red white
red white red
red red red)
3
4)))
(test-case
"triangle2"
(check image=?
(triangle 3 'solid 'red)
(color-list->image
(list white red white
white red white
red red red
red red red)
3
4)))
(test-case
"clipping-twice-clips-both-times"
(check image=?
(overlay
(rectangle 11 11 'solid 'green)
(clip (rectangle 11 11 'solid 'red)
5 5 1 1)
"center" "center")
(overlay
(rectangle 11 11 'solid 'green)
(clip (clip (rectangle 11 11 'solid 'red)
3 3 2 2)
2 2 1 1)
"center" "center")))
(test-case
"solid-rect"
(check-on-bitmap (rectangle 2 2 'solid 'red)))
(test-case
"outline-rect"
(check-on-bitmap (rectangle 2 2 'outline 'red)))
(test-case
"solid-ellipse"
(check-on-bitmap (ellipse 2 4 'solid 'red)))
(test-case
"outline-ellipse"
(check-on-bitmap (ellipse 2 4 'outline 'red)))
(test-case
"solid-circle"
(check-on-bitmap (circle 4 'solid 'red)))
(test-case
"outline-circle"
(check-on-bitmap (circle 4 'outline 'red)))
(test-case
"0solid-rect1"
(check-on-bitmap (rectangle 0 2 'solid 'red)))
(test-case
"0solid-rect2"
(check-on-bitmap (rectangle 2 0 'solid 'red)))
(test-case
"0outline-rect1"
(check-on-bitmap (rectangle 2 0 'outline 'red)))
(test-case
"0outline-rect2"
(check-on-bitmap (rectangle 0 0 'outline 'red)))
(test-case
"0solid-ellipse1"
(check-on-bitmap (ellipse 0 3 'solid 'red)))
(test-case
"0solid-ellipse2"
(check-on-bitmap (ellipse 3 0 'solid 'red)))
(test-case
"0outline-ellipse1"
(check-on-bitmap (ellipse 0 4 'outline 'red)))
(test-case
"0outline-ellipse2"
(check-on-bitmap (ellipse 2 0 'outline 'red)))
(test-case
"0solid-circle"
(check-on-bitmap (circle 0 'solid 'red)))
(test-case
"0outline-circle"
(check-on-bitmap (circle 0 'outline 'red)))
(test-case
"solid-triangle"
(check-on-bitmap (triangle 10 'solid 'red)))
(test-case
"outline-triangle"
(check-on-bitmap (triangle 10 'outline 'red)))
(test-case
"line"
(check-on-bitmap (line 10 7 0 0 9 6 'red)))
;; (check-on-bitmap 'text (text "XX" 12 'red)) ;; this test fails for reasons I can't control ... -robby
(test-case
"overlay1"
(check-on-bitmap (overlay (rectangle 1 4 'solid 'blue)
(rectangle 4 1 'solid 'green)
"left" "top")))
(test-case
"overlay2"
(check-on-bitmap (overlay (rectangle 4 4 'solid 'blue)
(rectangle 4 4 'solid 'green)
2 2)))
(test-case
"overlay3"
(check-on-bitmap (overlay image-snip1
(rectangle (image-width image-snip1)
(image-height image-snip1)
'outline
'red)
"center" "center")))
(test-case
"alpha-color-list"
(check-on-bitmap
(overlay
(rectangle 3 3 'solid 'blue)
(alpha-color-list->image
(list ared aclr ared
aclr aclr aclr
ared aclr ared)
3
3)
"center" "center")))
(test-case
"add-line"
(check-on-bitmap
(overlay
(rectangle 100 100 'solid 'black)
(line 100 100 -10 -10 110 110 'red)
0 0)))
(test-case
"add-line1"
(check-on-bitmap
(add-line (overlay (rectangle 11 11 'solid 'black) (rectangle 3 3 'solid 'green) "center" "center")
-20 -20
0 0
'red)))
(test-case
"add-line2"
(check-on-bitmap
(add-line (overlay (rectangle 11 11 'solid 'black) (rectangle 3 3 'solid 'green) "center" "center")
-20 20
0 0
'red)))
(test-case
"add-line3"
(check-on-bitmap
(add-line (overlay (rectangle 11 11 'solid 'black) (rectangle 3 3 'solid 'green) "center" "center")
20 -20
0 0
'red)))
(test-case
"add-line4"
(check-on-bitmap
(add-line (overlay (rectangle 11 11 'solid 'black) (rectangle 3 3 'solid 'green) "center" "center")
20 20
0 0
'red)))
(test-case
"add-line5"
(check-on-bitmap
(add-line (overlay (rectangle 11 11 'solid 'black) (rectangle 3 3 'solid 'green) "center" "center")
0 0
-20 -20
'red)))
(test-case
"add-line6"
(check-on-bitmap
(add-line (overlay (rectangle 11 11 'solid 'black) (rectangle 3 3 'solid 'green) "center" "center")
0 0
-20 20
'red)))
(test-case
"add-line7"
(add-line (overlay (rectangle 11 11 'solid 'black) (rectangle 3 3 'solid 'green) "center" "center")
0 0
20 -20
'red))
(test-case
"add-line8"
(check-on-bitmap
(add-line (overlay (rectangle 11 11 'solid 'black) (rectangle 3 3 'solid 'green) "center" "center")
0 0
20 20
'red)))
(test-case
"shrink"
(check-on-bitmap
(clip (rectangle 11 11 'solid 'red)
5 5 1 1)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; test images with zero width or zero height
;; for various things
;;
(test-case
"zero-width/height"
(check-equal? 10 (image-width (rectangle 10 0 'solid 'red)))
(check-equal? 0 (image-height (rectangle 10 0 'solid 'red)))
(check-equal? 0 (image-width (rectangle 0 10 'solid 'red)))
(check-equal? 10 (image-height (rectangle 0 10 'solid 'red)))
(check-equal? 0 (image-width (text "" 12 'black)))
(check > (image-height (text "" 12 'black)) 0)
(check-equal? '() (image->color-list (rectangle 0 10 'solid 'red)))
(check-equal? '() (image->color-list (rectangle 10 0 'solid 'red)))
(check-equal? '() (image->color-list (rectangle 0 0 'solid 'red)))
(check-equal? '() (image->alpha-color-list (rectangle 0 10 'solid 'red)))
(check-equal? '() (image->alpha-color-list (rectangle 10 0 'solid 'red)))
(check-equal? '() (image->alpha-color-list (rectangle 0 0 'solid 'red))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; test that the image construction functions
;; accept non-integer values (and floor them)
;;
(test-case
"accept-non-integer"
(check-equal? (image->color-list (rectangle 2 2 'solid 'blue))
(image->color-list (rectangle #e2.5 2.5 'solid 'blue)))
(check-equal? (image->color-list (ellipse 2 2 'solid 'blue))
(image->color-list (ellipse #e2.5 2.5 'solid 'blue)))
(check-equal? (image->color-list (circle 2 'solid 'blue))
(image->color-list (circle #e2.5 'solid 'blue)))
(check-equal? (image->color-list (triangle 12 'solid 'blue))
(image->color-list (triangle 12.5 'solid 'blue)))
(check-equal? (image->color-list (line 10 12 0 0 9 11 'blue))
(image->color-list (line 10 12 0 0 9.5 #e11.5 'blue)))
(check-equal? (image->color-list (clip (rectangle 10 10 'solid 'blue) 3 3 4 4))
(image->color-list
(clip (rectangle 10 10 'solid 'blue)
3.1
3.2
#e4.3
4.4)))
(check-equal? (image->color-list (add-line (rectangle 10 10 'solid 'blue)
0 0 2 2 'red))
(image->color-list (add-line (rectangle 10 10 'solid 'blue)
0.1 #e.2 2.1 2.2 'red))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; The tests beginning with "bs-" ensure
;; that the operations all can accept bitmap
;; snips as arguments
;;
(test-case
"accept-bitmap"
(check-pred image? image-snip1)
(check-pred image? image-snip2)
(check image=? image-snip1 (send image-snip1 copy))
(check-not-image=?
;; They have different masks:
image-snip1 image-snip2)
(check-equal? 2 (image-width image-snip1))
(check-equal? 2 (image-width image-snip2))
(check-equal? 2 (image-height image-snip1))
(check-equal? 2 (image-height image-snip2))
(check image=? image-snip1 (overlay image-snip1 image-snip2 "center" "center"))
(check image=? image-snip1 (overlay image-snip1 image-snip2 "left" "top"))
(check image=?
(add-line image-snip1 0 0 10 10 'green)
(add-line image-snip2 0 0 10 10 'green))
(check image-inside? image-snip1 image-snip2)
(check image-inside? image-snip2 image-snip1)
(check-equal? (make-posn 0 0)
(find-image image-snip1 image-snip2))
(check-equal? (make-posn 0 0)
(find-image image-snip2 image-snip1))
(check-equal? (image->color-list image-snip1)
(image->color-list image-snip2))
(check-equal? (image->alpha-color-list image-snip1)
(image->alpha-color-list image-snip2)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; test image-snip that doesnt' have a bitmap
;;
(test-case
"image-snip-no-bitmap"
(check-equal? 20
(image-width image-snip3))
(overlay image-snip3 image-snip3 10 10))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; test color arguments
;;
(test-case
"color-arguments"
(check-terminates (rectangle 10 10 'solid 'blue))
(check-terminates (rectangle 10 10 'solid "blue"))
(check-terminates (rectangle 10 10 'solid (make-color 0 0 255)))
(check-terminates (ellipse 10 10 'solid 'blue))
(check-terminates (ellipse 10 10 'solid "blue"))
(check-terminates (ellipse 10 10 'solid (make-color 0 0 255)))
(check-terminates (circle 10 'solid 'blue))
(check-terminates (circle 10 'solid "blue"))
(check-terminates (circle 10 'solid (make-color 0 0 255)))
(check-terminates (triangle 10 'solid 'blue))
(check-terminates (triangle 10 'solid "blue"))
(check-terminates (triangle 10 'solid (make-color 0 0 255)))
(check-terminates (line 10 10 0 0 9 9 'blue))
(check-terminates (line 10 10 0 0 9 9 "blue"))
(check-terminates (line 10 10 0 0 9 9 (make-color 0 0 255)))
(check-terminates (add-line (rectangle 1 1 'solid 'blue) 0 0 1 1 'blue))
(check-terminates (add-line (rectangle 1 1 'solid 'blue) 0 0 1 1 "blue"))
(check-terminates (add-line (rectangle 1 1 'solid 'blue) 0 0 1 1 (make-color 0 0 255)))
(check-terminates (text "abc" 12 'blue))
(check-terminates (text "abc" 12 "blue"))
(check-terminates (text "abc" 12 (make-color 0 0 255))))
(test-case
"error-message"
(err/rt-name-test (image-width 1) "first")
(err/rt-name-test (image-height 1) "first")
(err/rt-name-test (overlay 1 2 "center" "center") "first")
(err/rt-name-test (overlay image-snip1 2 "center" "center") "second")
(err/rt-name-test (overlay 1 2 "center" "center") "first")
(err/rt-name-test (overlay image-snip1 image-snip2 "foo" "center") "third")
(err/rt-name-test (overlay image-snip1 image-snip2 "center" "foo") "fourth")
(err/rt-name-test (rectangle #f #f #f #f) "first")
(err/rt-name-test (rectangle 10 #f #f #f) "second")
(err/rt-name-test (rectangle 10 10 #f #f) "third")
(err/rt-name-test (rectangle 10 10 'solid #f) "fourth")
(err/rt-name-test (circle #f #f #f) "first")
(err/rt-name-test (circle 10 #f #f) "second")
(err/rt-name-test (circle 10 'solid #f) "third")
(err/rt-name-test (ellipse #f #f #f #f) "first")
(err/rt-name-test (ellipse 10 #f #f #f) "second")
(err/rt-name-test (ellipse 10 10 #f #f) "third")
(err/rt-name-test (ellipse 10 10 'solid #f) "fourth")
(err/rt-name-test (triangle #f #f #f) "first")
(err/rt-name-test (triangle 10 #f #f) "second")
(err/rt-name-test (triangle 10 'solid #f) "third")
(err/rt-name-test (line #f #f 0 0 0 0 #f) "first")
(err/rt-name-test (line 10 #f 0 0 0 0 #f) "second")
(err/rt-name-test (line 10 10 #f 0 0 0 #f) "third")
(err/rt-name-test (line 10 10 0 #f 0 0 #f) "fourth")
(err/rt-name-test (line 10 10 0 0 #f 0 #f) "fifth")
(err/rt-name-test (line 10 10 0 0 0 #f #f) "sixth")
(err/rt-name-test (line 10 10 0 0 0 0 #f) "seventh")
(err/rt-name-test (text #f #f #f) "first")
(err/rt-name-test (text "abc" #f #f) "second")
(err/rt-name-test (text "abc" 10 #f) "third")
(err/rt-name-test (image-inside? #f #f) "first")
(err/rt-name-test (image-inside? image-snip1 #f) "second")
(err/rt-name-test (find-image #f #f) "first")
(err/rt-name-test (find-image image-snip1 #f) "second")
(err/rt-name-test (image->color-list 1) "first")
(err/rt-name-test (color-list->image #f #f #f) "first")
(err/rt-name-test (color-list->image (list (make-color 0 0 0)) #f #f) "second")
(err/rt-name-test (color-list->image (list (make-color 0 0 0)) 1 #f) "third")
(err/rt-name-test (image->alpha-color-list #f) "first")
(err/rt-name-test (alpha-color-list->image #f #f #f) "first")
(err/rt-name-test (alpha-color-list->image (list (make-alpha-color 0 0 0 0)) #f #f) "second")
(err/rt-name-test (alpha-color-list->image (list (make-alpha-color 0 0 0 0)) 1 #f) "third"))
))