You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
4.3 KiB
Racket
116 lines
4.3 KiB
Racket
#lang racket/base
|
|
(require rackunit
|
|
racket/class
|
|
"../base.rkt"
|
|
"../number.rkt"
|
|
"../optional.rkt"
|
|
"../base.rkt")
|
|
|
|
#|
|
|
approximates
|
|
https://github.com/mbutterick/restructure/blob/master/test/Optional.coffee
|
|
|#
|
|
|
|
(test-case
|
|
"optional: decode should not decode when condition is falsy"
|
|
(parameterize ([current-input-port (open-input-bytes (bytes 0))])
|
|
(define optional (x:optional uint8 #:condition #f))
|
|
(check-equal? (decode optional) (void))
|
|
(check-equal? (pos (current-input-port)) 0)))
|
|
|
|
(test-case
|
|
"optional: decode with post-decode"
|
|
(parameterize ([current-input-port (open-input-bytes (bytes 0))])
|
|
(define optional (x:optional uint8 #:condition #f #:post-decode (λ (val) 42)))
|
|
(check-equal? (decode optional) 42)
|
|
(check-equal? (pos (current-input-port)) 0)))
|
|
|
|
(test-case
|
|
"optional: decode should not decode when condition is a function and falsy"
|
|
(parameterize ([current-input-port (open-input-bytes (bytes 0))])
|
|
(define optional (x:optional uint8 #:condition (λ _ #f)))
|
|
(check-equal? (decode optional) (void))
|
|
(check-equal? (pos (current-input-port)) 0)))
|
|
|
|
(test-case
|
|
"optional: decode should decode when condition is omitted"
|
|
(parameterize ([current-input-port (open-input-bytes (bytes 0))])
|
|
(define optional (x:optional uint8))
|
|
(check-not-equal? (decode optional) (void))
|
|
(check-equal? (pos (current-input-port)) 1)))
|
|
|
|
(test-case
|
|
"optional: decode should decode when condition is truthy"
|
|
(parameterize ([current-input-port (open-input-bytes (bytes 0))])
|
|
(define optional (x:optional uint8 #:condition #t))
|
|
(check-not-equal? (decode optional) (void))
|
|
(check-equal? (pos (current-input-port)) 1)))
|
|
|
|
(test-case
|
|
"optional: decode should decode when condition is a function and truthy"
|
|
(parameterize ([current-input-port (open-input-bytes (bytes 0))])
|
|
(define optional (x:optional uint8 #:condition (λ _ #t)))
|
|
(check-not-equal? (decode optional) (void))
|
|
(check-equal? (pos (current-input-port)) 1)))
|
|
|
|
(test-case
|
|
"optional: size"
|
|
(check-equal? (send (x:optional uint8 #:condition #f) x:size) 0))
|
|
|
|
(test-case
|
|
"optional: size should return 0 when condition is a function and falsy"
|
|
(check-equal? (send (x:optional uint8 #:condition (λ _ #f)) x:size) 0))
|
|
|
|
(test-case
|
|
"optional: size should return given type size when condition is omitted"
|
|
(check-equal? (send (x:optional uint8) x:size) 1))
|
|
|
|
(test-case
|
|
"optional: size should return given type size when condition is truthy"
|
|
(check-equal? (send (x:optional uint8 #:condition #t) x:size) 1))
|
|
|
|
(test-case
|
|
"optional: size should return given type size when condition is a function and truthy"
|
|
(check-equal? (send (x:optional uint8 #:condition (λ _ #t)) x:size) 1))
|
|
|
|
(test-case
|
|
"optional: encode should not encode when condition is falsy"
|
|
(parameterize ([current-output-port (open-output-bytes)])
|
|
(define optional (x:optional uint8 #:condition #f))
|
|
(encode optional 128)
|
|
(check-equal? (get-output-bytes (current-output-port)) (bytes))))
|
|
|
|
(test-case
|
|
"optional: encode with pre-encode"
|
|
(parameterize ([current-output-port (open-output-bytes)])
|
|
(define optional (x:optional uint8 #:pre-encode (λ (val) 42)))
|
|
(encode optional 128)
|
|
(check-equal? (get-output-bytes (current-output-port)) (bytes 42))))
|
|
|
|
(test-case
|
|
"optional: encode should not encode when condition is a function and falsy"
|
|
(parameterize ([current-output-port (open-output-bytes)])
|
|
(define optional (x:optional uint8 #:condition (λ _ #f)))
|
|
(encode optional 128)
|
|
(check-equal? (get-output-bytes (current-output-port)) (bytes))))
|
|
|
|
(test-case
|
|
"optional: encode should encode when condition is omitted"
|
|
(parameterize ([current-output-port (open-output-bytes)])
|
|
(define optional (x:optional uint8))
|
|
(encode optional 128)
|
|
(check-equal? (get-output-bytes (current-output-port)) (bytes 128))))
|
|
|
|
(test-case
|
|
"optional: encode should encode when condition is truthy"
|
|
(parameterize ([current-output-port (open-output-bytes)])
|
|
(define optional (x:optional uint8 #:condition #t))
|
|
(encode optional 128)
|
|
(check-equal? (get-output-bytes (current-output-port)) (bytes 128))))
|
|
|
|
(test-case
|
|
"optional: encode should encode when condition is a function and truthy"
|
|
(parameterize ([current-output-port (open-output-bytes)])
|
|
(define optional (x:optional uint8 #:condition (λ _ #t)))
|
|
(encode optional 128)
|
|
(check-equal? (get-output-bytes (current-output-port)) (bytes 128)))) |