From ec946a275fe78fa231140c252e4ee0df80941829 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Tue, 11 Dec 2018 22:10:05 -0800 Subject: [PATCH] enum done --- xenomorph/xenomorph/redo/enum.rkt | 32 ++++++++++++++++++ xenomorph/xenomorph/redo/test/enum-test.rkt | 36 +++++++++++++++++++++ xenomorph/xenomorph/redo/test/main.rkt | 2 +- 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 xenomorph/xenomorph/redo/enum.rkt create mode 100644 xenomorph/xenomorph/redo/test/enum-test.rkt diff --git a/xenomorph/xenomorph/redo/enum.rkt b/xenomorph/xenomorph/redo/enum.rkt new file mode 100644 index 00000000..4568e915 --- /dev/null +++ b/xenomorph/xenomorph/redo/enum.rkt @@ -0,0 +1,32 @@ +#lang racket/base +(require "helper.rkt" racket/list) +(provide (all-defined-out)) + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/src/Enum.coffee +|# + +(define (xenum-decode xe [port-arg (current-input-port)] #:parent [parent #f]) + (define port (->input-port port-arg)) + (define index (decode (xenum-type xe) port)) + (or (list-ref (xenum-options xe) index) index)) + +(define (xenum-size xe [val #f] [parent #f]) (size (xenum-type xe))) + +(define (xenum-encode xe val [port-arg (current-output-port)] #:parent [parent #f]) + (define port (if (output-port? port-arg) port-arg (open-output-bytes))) + (define index (index-of (xenum-options xe) val)) + (unless index + (raise-argument-error 'Enum:encode "valid option" val)) + (encode (xenum-type xe) index port) + (unless port-arg (get-output-bytes port))) + +(struct xenum (type options) #:transparent + #:methods gen:xenomorphic + [(define decode xenum-decode) + (define encode xenum-encode) + (define size xenum-size)]) + +(define (+xenum type [options null]) + (xenum type options)) \ No newline at end of file diff --git a/xenomorph/xenomorph/redo/test/enum-test.rkt b/xenomorph/xenomorph/redo/test/enum-test.rkt new file mode 100644 index 00000000..02a232dd --- /dev/null +++ b/xenomorph/xenomorph/redo/test/enum-test.rkt @@ -0,0 +1,36 @@ +#lang racket/base +(require rackunit + sugar/unstable/dict + "../helper.rkt" + "../number.rkt" + "../enum.rkt") + +#| +approximates +https://github.com/mbutterick/restructure/blob/master/test/Enum.coffee +|# + +(define e (+xenum uint8 '("foo" "bar" "baz"))) + +(test-case + "should have the right size" + (check-equal? (size e) 1)) + +(test-case + "decode should decode" + (parameterize ([current-input-port (open-input-bytes (bytes 1 2 0))]) + (check-equal? (decode e) "bar") + (check-equal? (decode e) "baz") + (check-equal? (decode e) "foo"))) + +(test-case + "encode should encode" + (parameterize ([current-output-port (open-output-bytes)]) + (encode e "bar") + (encode e "baz") + (encode e "foo") + (check-equal? (dump (current-output-port)) (bytes 1 2 0)))) + +(test-case + "should throw on unknown option" + (check-exn exn:fail:contract? (λ () (encode e "unknown" (open-output-bytes))))) \ No newline at end of file diff --git a/xenomorph/xenomorph/redo/test/main.rkt b/xenomorph/xenomorph/redo/test/main.rkt index e2dd57ff..6791a71f 100644 --- a/xenomorph/xenomorph/redo/test/main.rkt +++ b/xenomorph/xenomorph/redo/test/main.rkt @@ -3,7 +3,7 @@ (require "array-test.rkt" "bitfield-test.rkt" "buffer-test.rkt" - ;"enum-test.rkt" + "enum-test.rkt" ;"lazy-array-test.rkt" "number-test.rkt" ;"optional-test.rkt"