On this page:
<test-infrastructure>
<lookup-in-table-tests>
<build-bfs-table-tests>2
<neighbors-tests>4
<adjacent-tests>2
<on-boundary?-tests>
<in-bounds?-tests>
<on-cats-path?-tests>2
<+/f-tests>
<render-world-tests>
<chop-whiskers-tests>2
<render-board-tests>
<render-cell-tests>
<world-size-tests>
<cell-center-x-tests>3
<cell-center-y-tests>2
<clack-tests>
<update-world-posn-tests>
<move-cat-tests>
<change-tests>
<release-tests>
<point-in-this-circle?-tests>3
<find-best-positions-tests>
<lt/f-tests>
<circle-at-point-tests>
<blocked-cells-tests>
1.18.9 Tests

This section consists of some infrastructure for maintaining tests, plus a pile of additional tests for the other functions in this document.

The test and test/set macros package up their arguments into thunks and then simply call test/proc, supplying information about the source location of the test case. The test/proc function runs the tests and reports the results.

  (define-syntax (test stx)
    (syntax-case stx ()
      [(_ actual expected)
       (with-syntax ([line (syntax-line stx)]
                     [pos (syntax-position stx)])
         #'(test/proc (λ () actual)
                      (λ () expected)
                      equal?
                      line
                      'actual))]))
  
  (define-syntax (test/set stx)
    (syntax-case stx ()
      [(_ actual expected)
       (with-syntax ([line (syntax-line stx)]
                     [pos (syntax-position stx)])
         #'(test/proc (λ () actual)
                      (λ () expected)
                      (λ (x y) (same-sets? x y))
                      line
                      'actual))]))
  
  (define test-count 0)
  
  (define (test/proc actual-thunk expected-thunk cmp line sexp)
    (set! test-count (+ test-count 1))
    (let ([actual (actual-thunk)]
          [expected (expected-thunk)])
      (unless (cmp actual expected)
        (error 'check-expect "test #~a~a\n  ~s\n  ~s\n"
               test-count
               (if line
                   (format " on line ~a failed:" line)
                   (format " failed: ~s" sexp))
               actual
               expected))))
  
  
  (define (same-sets? l1 l2)
    (and (andmap (lambda (e1) (member e1 l2)) l1)
         (andmap (lambda (e2) (member e2 l1)) l2)
         #t))
  
  (test (same-sets? (list) (list)) #t)
  (test (same-sets? (list) (list 1)) #f)
  (test (same-sets? (list 1) (list)) #f)
  (test (same-sets? (list 1 2) (list 2 1)) #t)

  (test (lookup-in-table empty (make-posn 1 2)) ')
  (test (lookup-in-table (list (make-dist-cell (make-posn 1 2) 3))
                         (make-posn 1 2))
        3)
  (test (lookup-in-table (list (make-dist-cell (make-posn 2 1) 3))
                         (make-posn 1 2))
        ')

  (test/set (build-bfs-table
             (make-world (empty-board 3) (make-posn 1 1)
                         'playing 3 (make-posn 0 0) #f)
             (make-posn 1 1))
            (list
             (make-dist-cell 'boundary 2)
  
             (make-dist-cell (make-posn 1 0) 1)
             (make-dist-cell (make-posn 2 0) 1)
  
             (make-dist-cell (make-posn 0 1) 1)
             (make-dist-cell (make-posn 1 1) 0)
             (make-dist-cell (make-posn 2 1) 1)
  
             (make-dist-cell (make-posn 1 2) 1)
             (make-dist-cell (make-posn 2 2) 1)))
  
  (test/set (build-bfs-table
             (make-world
              (list
               (make-cell (make-posn 0 1) #t)
               (make-cell (make-posn 1 0) #t)
               (make-cell (make-posn 1 1) #f)
               (make-cell (make-posn 1 2) #t)
               (make-cell (make-posn 2 0) #t)
               (make-cell (make-posn 2 1) #t)
               (make-cell (make-posn 2 2) #t))
              (make-posn 1 1)
              'playing
              3
              (make-posn 0 0)
              #f)
             'boundary)
            (list
             (make-dist-cell 'boundary 0)))
  
  (test/set (build-bfs-table
             (make-world (empty-board 5)
                         (make-posn 2 2)
                         'playing
                         5
                         (make-posn 0 0)
                         #f)
             'boundary)
            (list
             (make-dist-cell 'boundary 0)
  
             (make-dist-cell (make-posn 1 0) 1)
             (make-dist-cell (make-posn 2 0) 1)
             (make-dist-cell (make-posn 3 0) 1)
             (make-dist-cell (make-posn 4 0) 1)
  
             (make-dist-cell (make-posn 0 1) 1)
             (make-dist-cell (make-posn 1 1) 2)
             (make-dist-cell (make-posn 2 1) 2)
             (make-dist-cell (make-posn 3 1) 2)
             (make-dist-cell (make-posn 4 1) 1)
  
             (make-dist-cell (make-posn 0 2) 1)
             (make-dist-cell (make-posn 1 2) 2)
             (make-dist-cell (make-posn 2 2) 3)
             (make-dist-cell (make-posn 3 2) 2)
             (make-dist-cell (make-posn 4 2) 1)
  
             (make-dist-cell (make-posn 0 3) 1)
             (make-dist-cell (make-posn 1 3) 2)
             (make-dist-cell (make-posn 2 3) 2)
             (make-dist-cell (make-posn 3 3) 2)
             (make-dist-cell (make-posn 4 3) 1)
  
             (make-dist-cell (make-posn 1 4) 1)
             (make-dist-cell (make-posn 2 4) 1)
             (make-dist-cell (make-posn 3 4) 1)
             (make-dist-cell (make-posn 4 4) 1)))
  
  (test/set (build-bfs-table
             (make-world (block-cell
                          (make-posn 4 2)
                          (empty-board 5))
                         (make-posn 2 2)
                         'playing
                         5
                         (make-posn 0 0)
                         #f)
             'boundary)
            (list
             (make-dist-cell 'boundary 0)
  
             (make-dist-cell (make-posn 1 0) 1)
             (make-dist-cell (make-posn 2 0) 1)
             (make-dist-cell (make-posn 3 0) 1)
             (make-dist-cell (make-posn 4 0) 1)
  
             (make-dist-cell (make-posn 0 1) 1)
             (make-dist-cell (make-posn 1 1) 2)
             (make-dist-cell (make-posn 2 1) 2)
             (make-dist-cell (make-posn 3 1) 2)
             (make-dist-cell (make-posn 4 1) 1)
  
             (make-dist-cell (make-posn 0 2) 1)
             (make-dist-cell (make-posn 1 2) 2)
             (make-dist-cell (make-posn 2 2) 3)
             (make-dist-cell (make-posn 3 2) 3)
  
             (make-dist-cell (make-posn 0 3) 1)
             (make-dist-cell (make-posn 1 3) 2)
             (make-dist-cell (make-posn 2 3) 2)
             (make-dist-cell (make-posn 3 3) 2)
             (make-dist-cell (make-posn 4 3) 1)
  
             (make-dist-cell (make-posn 1 4) 1)
             (make-dist-cell (make-posn 2 4) 1)
             (make-dist-cell (make-posn 3 4) 1)
             (make-dist-cell (make-posn 4 4) 1)))
  
  (test/set (build-bfs-table
             (make-world (empty-board 5)
                         (make-posn 2 2)
                         'playing
                         5
                         (make-posn 0 0)
                         #f)
             (make-posn 2 2))
            (list
             (make-dist-cell 'boundary 3)
  
             (make-dist-cell (make-posn 1 0) 2)
             (make-dist-cell (make-posn 2 0) 2)
             (make-dist-cell (make-posn 3 0) 2)
             (make-dist-cell (make-posn 4 0) 3)
  
             (make-dist-cell (make-posn 0 1) 2)
             (make-dist-cell (make-posn 1 1) 1)
             (make-dist-cell (make-posn 2 1) 1)
             (make-dist-cell (make-posn 3 1) 2)
             (make-dist-cell (make-posn 4 1) 3)
  
             (make-dist-cell (make-posn 0 2) 2)
             (make-dist-cell (make-posn 1 2) 1)
             (make-dist-cell (make-posn 2 2) 0)
             (make-dist-cell (make-posn 3 2) 1)
             (make-dist-cell (make-posn 4 2) 2)
  
             (make-dist-cell (make-posn 0 3) 2)
             (make-dist-cell (make-posn 1 3) 1)
             (make-dist-cell (make-posn 2 3) 1)
             (make-dist-cell (make-posn 3 3) 2)
             (make-dist-cell (make-posn 4 3) 3)
  
             (make-dist-cell (make-posn 1 4) 2)
             (make-dist-cell (make-posn 2 4) 2)
             (make-dist-cell (make-posn 3 4) 2)
             (make-dist-cell (make-posn 4 4) 3)))
  
  (test (lookup-in-table
         (build-bfs-table (make-world (empty-board 5)
                                      (make-posn 2 2)
                                      'playing
                                      5
                                      (make-posn 0 0)
                                      #f)
                          (make-posn 2 2))
         (make-posn 1 4))
        2)

  (test ((neighbors (empty-world 11))  (make-posn 1 1))
        (adjacent (make-posn 1 1)))
  (test ((neighbors (empty-world 11)) (make-posn 2 2))
        (adjacent (make-posn 2 2)))
  (test ((neighbors (empty-world 3)) 'boundary)
        (list (make-posn 0 1)
              (make-posn 1 0)
              (make-posn 1 2)
              (make-posn 2 0)
              (make-posn 2 1)
              (make-posn 2 2)))
  (test ((neighbors (make-world (list
                                 (make-cell (make-posn 0 1) #f)
                                 (make-cell (make-posn 1 0) #f)
                                 (make-cell (make-posn 1 1) #t)
                                 (make-cell (make-posn 1 2) #f)
                                 (make-cell (make-posn 2 0) #f)
                                 (make-cell (make-posn 2 1) #f)
                                 (make-cell (make-posn 2 2) #f))
                                (make-posn 1 1)
                                'playing
                                3
                                (make-posn 0 0)
                                #f))
         (make-posn 1 1))
        '())
  (test ((neighbors (make-world (list
                                 (make-cell (make-posn 0 1) #f)
                                 (make-cell (make-posn 1 0) #f)
                                 (make-cell (make-posn 1 1) #t)
                                 (make-cell (make-posn 1 2) #f)
                                 (make-cell (make-posn 2 0) #f)
                                 (make-cell (make-posn 2 1) #f)
                                 (make-cell (make-posn 2 2) #f))
                                (make-posn 1 1)
                                'playing
                                3
                                (make-posn 0 0)
                                #f))
         (make-posn 1 0))
        (list 'boundary (make-posn 2 0) (make-posn 0 1)))

  (test (adjacent (make-posn 1 1))
        (list (make-posn 1 0)
              (make-posn 2 0)
              (make-posn 0 1)
              (make-posn 2 1)
              (make-posn 1 2)
              (make-posn 2 2)))
  (test (adjacent (make-posn 2 2))
        (list (make-posn 1 1)
              (make-posn 2 1)
              (make-posn 1 2)
              (make-posn 3 2)
              (make-posn 1 3)
              (make-posn 2 3)))

  (test (on-boundary? (make-posn 0 1) 13) #t)
  (test (on-boundary? (make-posn 1 0) 13) #t)
  (test (on-boundary? (make-posn 12 1) 13) #t)
  (test (on-boundary? (make-posn 1 12) 13) #t)
  (test (on-boundary? (make-posn 1 1) 13) #f)
  (test (on-boundary? (make-posn 10 10) 13) #f)

  (test (in-bounds? (make-posn 0 0) 11) #f)
  (test (in-bounds? (make-posn 0 1) 11) #t)
  (test (in-bounds? (make-posn 1 0) 11) #t)
  (test (in-bounds? (make-posn 10 10) 11) #t)
  (test (in-bounds? (make-posn 0 -1) 11) #f)
  (test (in-bounds? (make-posn -1 0) 11) #f)
  (test (in-bounds? (make-posn 0 11) 11) #f)
  (test (in-bounds? (make-posn 11 0) 11) #f)
  (test (in-bounds? (make-posn 10 0) 11) #t)
  (test (in-bounds? (make-posn 0 10) 11) #f)

  (test ((on-cats-path? (make-world (empty-board 5)
                                    (make-posn 1 1)
                                    'playing
                                    5
                                    (make-posn 0 0)
                                    #t))
         (make-posn 1 0))
        #t)
  (test ((on-cats-path? (make-world (empty-board 5)
                                    (make-posn 1 1)
                                    'playing
                                    5
                                    (make-posn 0 0)
                                    #f))
         (make-posn 1 0))
        #f)
  
  (test ((on-cats-path? (make-world (empty-board 5) (make-posn 1 1)
                                    'playing 5 (make-posn 0 0) #t))
         (make-posn 2 1))
        #f)
  (test ((on-cats-path?
          (make-world (list
                       (make-cell (make-posn 0 1) #t)
                       (make-cell (make-posn 1 0) #t)
                       (make-cell (make-posn 1 1) #f)
                       (make-cell (make-posn 1 2) #t)
                       (make-cell (make-posn 2 0) #t)
                       (make-cell (make-posn 2 1) #t)
                       (make-cell (make-posn 2 2) #t))
                      (make-posn 1 1)
                      'cat-lost
                      3
                      (make-posn 0 0)
                      #t))
         (make-posn 0 1))
        #f)

  (test (+/f ' ') ')
  (test (+/f ' 1) ')
  (test (+/f 1 ') ')
  (test (+/f 1 2) 3)

  (test
   (render-world
    (make-world (list (make-cell (make-posn 0 1) #f))
                (make-posn 0 1)
                'playing
                3
                (make-posn 0 0)
                #f))
   (overlay
    (render-board (list (make-cell (make-posn 0 1) #f))
                  3
                  (lambda (x) #t)
                  #f)
    (move-pinhole thinking-cat
                  (- (cell-center-x (make-posn 0 1)))
                  (- (cell-center-y (make-posn 0 1))))))
  
  (test
   (render-world
    (make-world (list (make-cell (make-posn 0 1) #f))
                (make-posn 0 1)
                'cat-won
                3
                #f
                #f))
   (overlay
    (render-board (list (make-cell (make-posn 0 1) #f))
                  3
                  (lambda (x) #t)
                  #f)
    (move-pinhole happy-cat
                  (- (cell-center-x (make-posn 0 1)))
                  (- (cell-center-y (make-posn 0 1))))))
  
  (test
   (render-world
    (make-world (list (make-cell (make-posn 0 1) #f))
                (make-posn 0 1)
                'cat-lost
                3
                #f
                #f))
   (overlay
    (render-board (list (make-cell (make-posn 0 1) #f))
                  3
                  (lambda (x) #t)
                  #f)
    (move-pinhole mad-cat
                  (- (cell-center-x (make-posn 0 1)))
                  (- (cell-center-y (make-posn 0 1))))))
  
  (test
   (render-world
    (make-world (list
                 (make-cell (make-posn 0 1) #t)
                 (make-cell (make-posn 1 0) #t)
                 (make-cell (make-posn 1 1) #f)
                 (make-cell (make-posn 1 2) #t)
                 (make-cell (make-posn 2 0) #t)
                 (make-cell (make-posn 2 1) #t)
                 (make-cell (make-posn 2 2) #t))
                (make-posn 1 1)
                'cat-lost
                3
                #f
                #f))
   (overlay
    (render-board (list
                   (make-cell (make-posn 0 1) #t)
                   (make-cell (make-posn 1 0) #t)
                   (make-cell (make-posn 1 1) #f)
                   (make-cell (make-posn 1 2) #t)
                   (make-cell (make-posn 2 0) #t)
                   (make-cell (make-posn 2 1) #t)
                   (make-cell (make-posn 2 2) #t))
                  3
                  (lambda (x) #f)
                  #f)
    (move-pinhole mad-cat
                  (- (cell-center-x (make-posn 1 1)))
                  (- (cell-center-y (make-posn 1 1))))))
  
  (test
   (render-world
    (make-world (list
                 (make-cell (make-posn 0 1) #f)
                 (make-cell (make-posn 1 0) #f)
                 (make-cell (make-posn 1 1) #f)
                 (make-cell (make-posn 1 2) #f)
                 (make-cell (make-posn 2 0) #f)
                 (make-cell (make-posn 2 1) #f)
                 (make-cell (make-posn 2 2) #f))
                (make-posn 1 1)
                'cat-lost
                3
                (make-posn (cell-center-x (make-posn 0 1))
                           (cell-center-y (make-posn 0 1)))
                #t))
  
   (overlay
    (render-board (list
                   (make-cell (make-posn 0 1) #f)
                   (make-cell (make-posn 1 0) #f)
                   (make-cell (make-posn 1 1) #f)
                   (make-cell (make-posn 1 2) #f)
                   (make-cell (make-posn 2 0) #f)
                   (make-cell (make-posn 2 1) #f)
                   (make-cell (make-posn 2 2) #f))
                  3
                  (lambda (x) #t)
                  (make-posn (cell-center-x (make-posn 0 1))
                             (cell-center-y (make-posn 0 1))))
    (move-pinhole mad-cat
                  (- (cell-center-x (make-posn 1 1)))
                  (- (cell-center-y (make-posn 1 1))))))

  (test (chop-whiskers (rectangle 6 6 'solid 'black))
        (put-pinhole (rectangle 3 3 'solid 'black) 0 0))
  
  (test
   (pinhole-x
    (render-world
     (make-world
      (empty-board 3)
      (make-posn 0 0)
      'playing
      3
      (make-posn 0 0)
      #f)))
   0)
  (test
   (pinhole-x
    (render-world
     (make-world
      (empty-board 3)
      (make-posn 0 1)
      'playing
      3
      (make-posn 0 0)
      #f)))
   0)

  (test (render-board (list (make-cell (make-posn 0 0) #f))
                      3
                      (lambda (x) #f)
                      #f)
        (overlay
         (nw:rectangle (world-width 3)
                       (world-height 3)
                       'solid
                       'white)
         (render-cell (make-cell (make-posn 0 0) #f)
                      #f
                      #f)))
  
  (test (render-board (list (make-cell (make-posn 0 0) #f))
                      3
                      (lambda (x) #t)
                      #f)
        (overlay
         (nw:rectangle (world-width 3)
                       (world-height 3)
                       'solid
                       'white)
         (render-cell (make-cell (make-posn 0 0) #f)
                      #t
                      #f)))
  
  
  (test (render-board (list (make-cell (make-posn 0 0) #f))
                      3
                      (lambda (x) #f)
                      #f)
        (overlay
         (nw:rectangle (world-width 3)
                       (world-height 3)
                       'solid
                       'white)
         (render-cell (make-cell (make-posn 0 0) #f)
                      #f
                      #f)))
  
  (test (render-board (list (make-cell (make-posn 0 0) #f)
                            (make-cell (make-posn 0 1) #f))
                      3
                      (lambda (x) (equal? x (make-posn 0 1)))
                      #f)
        (overlay
         (nw:rectangle (world-width 3)
                       (world-height 3)
                       'solid
                       'white)
         (render-cell (make-cell (make-posn 0 0) #f)
                      #f
                      #f)
         (render-cell (make-cell (make-posn 0 1) #f)
                      #t
                      #f)))
  
  (test (render-board (list (make-cell (make-posn 0 0) #f)
                            (make-cell (make-posn 0 1) #f))
                      3
                      (lambda (x) (equal? x (make-posn 0 1)))
                      (make-posn 0 0))
        (overlay
         (nw:rectangle (world-width 3)
                       (world-height 3)
                       'solid
                       'white)
         (render-cell (make-cell (make-posn 0 0) #f)
                      #f
                      #t)
         (render-cell (make-cell (make-posn 0 1) #f)
                      #t
                      #f)))

  (test (render-cell (make-cell (make-posn 0 0) #f) #f #f)
        (move-pinhole (circle circle-radius 'solid normal-color)
                      (- circle-radius)
                      (- circle-radius)))
  (test (render-cell (make-cell (make-posn 0 0) #t) #f #f)
        (move-pinhole (circle circle-radius 'solid 'black)
                      (- circle-radius)
                      (- circle-radius)))
  (test (render-cell (make-cell (make-posn 0 0) #f) #t #f)
        (move-pinhole (overlay (circle circle-radius 'solid normal-color)
                               (circle (quotient circle-radius 2) 'solid
                                       on-shortest-path-color))
                      (- circle-radius)
                      (- circle-radius)))
  (test (render-cell (make-cell (make-posn 0 0) #f) #t #t)
        (move-pinhole (overlay (circle circle-radius 'solid normal-color)
                               (circle (quotient circle-radius 2) 'solid
                                       under-mouse-color))
                      (- circle-radius)
                      (- circle-radius)))

  (test (world-width 3) 150)
  (test (world-height 3) 117)

  (test (cell-center-x (make-posn 0 0))
        circle-radius)
  (test (cell-center-x (make-posn 1 0))
        (+ (* 2 circle-spacing) circle-radius))
  (test (cell-center-x (make-posn 1 1))
        (+ (* 3 circle-spacing) circle-radius))

  (test (cell-center-y (make-posn 1 1))
        (+ circle-radius (* 2 circle-spacing 433/500)))

  (test (clack
         (make-world '() (make-posn 0 0) 'playing 3 #f #f)
         1 1 "button-down")
        (make-world '() (make-posn 0 0) 'playing 3 #f #f))
  (test (clack
         (make-world '() (make-posn 0 0) 'playing 3 #f #f)
         1 1 'drag)
        (make-world '() (make-posn 0 0) 'playing 3 #f #f))
  (test (clack
         (make-world (list (make-cell (make-posn 0 0) #f))
                     (make-posn 0 1)
                     'playing
                     3
                     #f
                     #f)
         (cell-center-x (make-posn 0 0))
         (cell-center-y (make-posn 0 0))
         'move)
        (make-world
         (list (make-cell (make-posn 0 0) #f))
         (make-posn 0 1)
         'playing
         3
         (make-posn 0 0)
         #f))
  (test (clack
         (make-world (list (make-cell (make-posn 0 0) #f))
                     (make-posn 0 1)
                     'playing
                     3
                     #f
                     #f)
         (cell-center-x (make-posn 0 0))
         (cell-center-y (make-posn 0 0))
         'enter)
        (make-world
         (list (make-cell (make-posn 0 0) #f))
         (make-posn 0 1)
         'playing
         3
         (make-posn 0 0)
         #f))
  (test (clack
         (make-world '() (make-posn 0 0)
                     'playing 3 (make-posn 0 0) #f)
               1 1 'leave)
        (make-world '() (make-posn 0 0) 'playing 3 #f #f))
  
  (test (clack (make-world '() (make-posn 0 0)
                           'playing 3 (make-posn 0 0) #f)
               10
               10
               "button-down")
        (make-world '() (make-posn 0 0) 'playing 3 #f #f))
  
  (test (clack (make-world (list (make-cell (make-posn 0 0) #f)
                                 (make-cell (make-posn 1 1) #f))
                           (make-posn 1 1)
                           'playing
                           3
                           (make-posn 0 0)
                           #f)
               (cell-center-x (make-posn 0 0))
               (cell-center-y (make-posn 0 0))
               "button-up")
        (make-world (list (make-cell (make-posn 0 0) #t)
                          (make-cell (make-posn 1 1) #f))
                    (make-posn 1 1)
                    'cat-lost
                    3
                    #f
                    #f))
  
  
  (test (clack (make-world '() (make-posn 0 0)
                           'cat-lost 3 (make-posn 0 0) #f)
               10
               10
               "button-up")
        (make-world '() (make-posn 0 0)
                    'cat-lost 3 #f #f))
  (test (clack
         (make-world
          (list (make-cell (make-posn 1 0) #f)
                (make-cell (make-posn 2 0) #t)
                (make-cell (make-posn 0 1) #t)
                (make-cell (make-posn 1 1) #f)
                (make-cell (make-posn 2 1) #t)
                (make-cell (make-posn 1 2) #t)
                (make-cell (make-posn 2 2) #t))
          (make-posn 1 1)
          'playing
          3
          #f
          #f)
         (cell-center-x (make-posn 1 0))
         (cell-center-y (make-posn 1 0))
         "button-up")
        (make-world
         (list (make-cell (make-posn 1 0) #t)
               (make-cell (make-posn 2 0) #t)
               (make-cell (make-posn 0 1) #t)
               (make-cell (make-posn 1 1) #f)
               (make-cell (make-posn 2 1) #t)
               (make-cell (make-posn 1 2) #t)
               (make-cell (make-posn 2 2) #t))
         (make-posn 1 1)
         'cat-lost
         3
         #f
         #f))
  
  (test (clack
         (make-world
          (list (make-cell (make-posn 1 0) #f)
                (make-cell (make-posn 2 0) #f)
                (make-cell (make-posn 0 1) #t)
                (make-cell (make-posn 1 1) #f)
                (make-cell (make-posn 2 1) #t)
                (make-cell (make-posn 1 2) #t)
                (make-cell (make-posn 2 2) #t))
          (make-posn 1 1)
          'playing
          3
          #f
          #f)
         (cell-center-x (make-posn 1 0))
         (cell-center-y (make-posn 1 0))
         "button-up")
        (make-world
         (list (make-cell (make-posn 1 0) #t)
               (make-cell (make-posn 2 0) #f)
               (make-cell (make-posn 0 1) #t)
               (make-cell (make-posn 1 1) #f)
               (make-cell (make-posn 2 1) #t)
               (make-cell (make-posn 1 2) #t)
               (make-cell (make-posn 2 2) #t))
         (make-posn 2 0)
         'cat-won
         3
         #f
         #f))

  (test (update-world-posn
         (make-world (list (make-cell (make-posn 0 0) #f))
                     (make-posn 0 1) 'playing 3 #f #f)
         (make-posn (cell-center-x (make-posn 0 0))
                    (cell-center-y (make-posn 0 0))))
        (make-world (list (make-cell (make-posn 0 0) #f))
                    (make-posn 0 1) 'playing 3 (make-posn 0 0) #f))
  
  (test (update-world-posn
         (make-world (list (make-cell (make-posn 0 0) #f))
                     (make-posn 0 0) 'playing 3 #f #f)
         (make-posn (cell-center-x (make-posn 0 0))
                    (cell-center-y (make-posn 0 0))))
        (make-world (list (make-cell (make-posn 0 0) #f))
                    (make-posn 0 0) 'playing 3 #f #f))
  
  (test (update-world-posn
         (make-world (list (make-cell (make-posn 0 0) #f))
                     (make-posn 0 1) 'playing 3 (make-posn 0 0) #f)
         (make-posn 0 0))
        (make-world (list (make-cell (make-posn 0 0) #f))
                    (make-posn 0 1) 'playing 3 #f #f))

  (test
   (move-cat
    (make-world (list (make-cell (make-posn 1 0) #f)
                      (make-cell (make-posn 2 0) #f)
                      (make-cell (make-posn 3 0) #f)
                      (make-cell (make-posn 4 0) #f)
  
                      (make-cell (make-posn 0 1) #f)
                      (make-cell (make-posn 1 1) #t)
                      (make-cell (make-posn 2 1) #t)
                      (make-cell (make-posn 3 1) #f)
                      (make-cell (make-posn 4 1) #f)
  
                      (make-cell (make-posn 0 2) #f)
                      (make-cell (make-posn 1 2) #t)
                      (make-cell (make-posn 2 2) #f)
                      (make-cell (make-posn 3 2) #t)
                      (make-cell (make-posn 4 2) #f)
  
                      (make-cell (make-posn 0 3) #f)
                      (make-cell (make-posn 1 3) #t)
                      (make-cell (make-posn 2 3) #f)
                      (make-cell (make-posn 3 3) #f)
                      (make-cell (make-posn 4 3) #f)
  
                      (make-cell (make-posn 1 4) #f)
                      (make-cell (make-posn 2 4) #f)
                      (make-cell (make-posn 3 4) #f)
                      (make-cell (make-posn 4 4) #f))
                (make-posn 2 2)
                'playing
                5
                (make-posn 0 0)
                #f))
   (make-world (list (make-cell (make-posn 1 0) #f)
                     (make-cell (make-posn 2 0) #f)
                     (make-cell (make-posn 3 0) #f)
                     (make-cell (make-posn 4 0) #f)
  
                     (make-cell (make-posn 0 1) #f)
                     (make-cell (make-posn 1 1) #t)
                     (make-cell (make-posn 2 1) #t)
                     (make-cell (make-posn 3 1) #f)
                     (make-cell (make-posn 4 1) #f)
  
                     (make-cell (make-posn 0 2) #f)
                     (make-cell (make-posn 1 2) #t)
                     (make-cell (make-posn 2 2) #f)
                     (make-cell (make-posn 3 2) #t)
                     (make-cell (make-posn 4 2) #f)
  
                     (make-cell (make-posn 0 3) #f)
                     (make-cell (make-posn 1 3) #t)
                     (make-cell (make-posn 2 3) #f)
                     (make-cell (make-posn 3 3) #f)
                     (make-cell (make-posn 4 3) #f)
  
                     (make-cell (make-posn 1 4) #f)
                     (make-cell (make-posn 2 4) #f)
                     (make-cell (make-posn 3 4) #f)
                     (make-cell (make-posn 4 4) #f))
               (make-posn 2 3)
               'playing
               5
               (make-posn 0 0)
               #f))

  (test (change (make-world '() (make-posn 1 1)
                            'playing 3 (make-posn 0 0) #f)
                "h")
        (make-world '() (make-posn 1 1)
                    'playing 3 (make-posn 0 0) #t))
  (test (change (make-world '() (make-posn 1 1)
                            'playing 3 (make-posn 0 0) #f)
                "n")
        (make-world '() (make-posn 1 1)
                    'playing 3 (make-posn 0 0) #f))
  (test (world-state (change (make-world '() (make-posn 1 1)
                                         'cat-lost 3 (make-posn 0 0) #f)
                             "n"))
        'playing)

  (test (release (make-world '() (make-posn 1 1)
                             'playing 3 (make-posn 0 0) #t)
                 "h")
        (make-world '() (make-posn 1 1)
                    'playing 3 (make-posn 0 0) #f))

  (test (point-in-this-circle? (make-posn 0 0)
                               (cell-center-x (make-posn 0 0))
                               (cell-center-y (make-posn 0 0)))
        #t)
  (test (point-in-this-circle? (make-posn 0 0) 0 0)
        #f)

  (test (find-best-positions (list (make-posn 0 0)) (list 1))
        (list (make-posn 0 0)))
  (test (find-best-positions (list (make-posn 0 0)) (list '))
        #f)
  (test (find-best-positions (list (make-posn 0 0)
                                   (make-posn 1 1))
                             (list 1 2))
        (list (make-posn 0 0)))
  (test (find-best-positions (list (make-posn 0 0)
                                   (make-posn 1 1))
                             (list 1 1))
        (list (make-posn 0 0)
              (make-posn 1 1)))
  (test (find-best-positions (list (make-posn 0 0)
                                   (make-posn 1 1))
                             (list ' 2))
        (list (make-posn 1 1)))
  (test (find-best-positions (list (make-posn 0 0)
                                   (make-posn 1 1))
                             (list ' '))
        #f)

  (test (<=/f 1 2) #t)
  (test (<=/f 2 1) #f)
  (test (<=/f ' 1) #f)
  (test (<=/f 1 ') #t)
  (test (<=/f ' ') #t)

  (test (circle-at-point empty 0 0) #f)
  (test (circle-at-point (list (make-cell (make-posn 0 0) #f))
                         (cell-center-x (make-posn 0 0))
                         (cell-center-y (make-posn 0 0)))
        (make-posn 0 0))
  (test (circle-at-point (list (make-cell (make-posn 0 0) #f)
                               (make-cell (make-posn 0 1) #f))
                         (cell-center-x (make-posn 0 1))
                         (cell-center-y (make-posn 0 1)))
        (make-posn 0 1))
  (test (circle-at-point (list (make-cell (make-posn 0 0) #f))
                         0 0)
        #f)

  (test (block-cell (make-posn 1 1)
                    (list (make-cell (make-posn 0 0) #f)
                          (make-cell (make-posn 1 1) #f)
                          (make-cell (make-posn 2 2) #f)))
        (list (make-cell (make-posn 0 0) #f)
              (make-cell (make-posn 1 1) #t)
              (make-cell (make-posn 2 2) #f)))
  
  (test (add-n-random-blocked-cells 0 (list (make-cell (make-posn 0 0)
                                                       #t))
                                    3)
        (list (make-cell (make-posn 0 0) #t)))
  (test (add-n-random-blocked-cells 1 (list (make-cell (make-posn 0 0)
                                                       #f))
                                    3)
        (list (make-cell (make-posn 0 0) #t)))