www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

test-external-mutation.rkt (3185B)


      1 #lang typed/racket
      2 (require delay-pure
      3          typed/rackunit)
      4 
      5 ;; This file checks that externally mutating a free variable on which a pure
      6 ;; function or promise depends does not affect the function's result.
      7 (check-equal? (let ([x 1])
      8                 (define d (delay/pure/stateful (add1 x)))
      9                 (list (begin (set! x -10) (force d))
     10                       (begin (set! x -11) (force d))))
     11               '(2 2))
     12 
     13 (check-equal? (let ([x 1])
     14                 (define d (delay/pure/stateless (add1 x)))
     15                 (list (begin (set! x -10) (force d))
     16                       (begin (set! x -11) (force d))))
     17               '(2 2))
     18 
     19 ;; pure/stateless and pure/stateful do not protect the expression from
     20 ;; external mutations, so we are not testing this case here.
     21 
     22 (check-equal? (let ([x 1])
     23                 (define d (pure-thunk/stateless (λ () (add1 x))))
     24                 (list (begin (set! x -10) (d))
     25                       (begin (set! x -11) (d))))
     26               '(2 2))
     27 
     28 (check-equal? (let ([x 1])
     29                 (define d (pure-thunk/stateless (λ () (add1 x)) #:check-result))
     30                 (list (begin (set! x -10) (d))
     31                       (begin (set! x -11) (d))))
     32               '(2 2))
     33 
     34 (check-equal? (let ([x 1])
     35                 (define d (pure-thunk/stateful (λ () (add1 x))))
     36                 (list (begin (set! x -10) (d))
     37                       (begin (set! x -11) (d))))
     38               '(2 2))
     39 
     40 (check-equal? (let ([x 1])
     41                 (define d (pure-thunk/stateful (λ () (add1 x)) #:check-result))
     42                 (list (begin (set! x -10) (d))
     43                       (begin (set! x -11) (d))))
     44               '(2 2))
     45 
     46 (check-equal? (let ([x 1])
     47                 (define-pure/stateless (d) (add1 x))
     48                 (list (begin (set! x -10) (d))
     49                       (begin (set! x -11) (d))))
     50               '(2 2))
     51 
     52 (check-equal? (let ([x 1])
     53                 (define-pure/stateless (d [opt : Number x]) (add1 opt))
     54                 (list (begin (set! x -10) (d))
     55                       (begin (set! x -11) (d))))
     56               '(2 2))
     57 
     58 (check-equal? (let ([x 1])
     59                 (define-pure/stateless (d #:kw [opt : Number x]) (add1 opt))
     60                 (list (begin (set! x -10) (d))
     61                       (begin (set! x -11) (d))))
     62               '(2 2))
     63 
     64 (check-equal? (let ([x 1])
     65                 (define-pure/stateful (d) (add1 x))
     66                 (list (begin (set! x -10) (d))
     67                       (begin (set! x -11) (d))))
     68               '(2 2))
     69 
     70 (check-equal? (let ([x 1])
     71                 (define-pure/stateful (d [opt : Number x]) (add1 opt))
     72                 (list (begin (set! x -10) (d))
     73                       (begin (set! x -11) (d))))
     74               '(2 2))
     75 
     76 (check-equal? (let ([x 1])
     77                 (define-pure/stateful (d #:kw [opt : Number x]) (add1 opt))
     78                 (list (begin (set! x -10) (d))
     79                       (begin (set! x -11) (d))))
     80               '(2 2))
     81 
     82 ;; Check that this doesn't cause a run-time error due to the internal use of
     83 ;; unsafe-undefined in the expanded function with optional arguments (starting
     84 ;; from Racket 6.90.0.29)
     85 (define z 1)
     86 (define-pure/stateless (d [opt : Number z]) (void))
     87 (d)