test-bitmatch-bitstitch.rkt
#lang racket/base

(require "bitstring.rkt")
(require "bitmatch.rkt")
(require "bitstitch.rkt")
(require rackunit)

(define (experiment-one v)
  (bit-string-case v
    ([(= 0 : bytes 2)] 'yeah)
    ([(f : bits 10) (: binary)]
     (when (and (< f 123)
		(>= f 100)))
     'between-100-and-123)
    ([(f : bits 10) (: bits 6)]
     f)
    ([(f : bits 10) (: bits 6) (rest : binary)]
     (list f rest))))

(check-equal? (experiment-one (bytes 0 0)) 'yeah)
(check-equal? (experiment-one (bytes 252 0)) 1008)
(check-equal? (experiment-one (bytes 25 64)) 'between-100-and-123)
(check-equal? (experiment-one (bytes 252 0 123))
	      (list 1008 (sub-bit-string (bytes 252 0 123) 16 24)))
(check-equal? (bit-string-pack (cadr (experiment-one (bytes 252 0 123))))
	      (bytes 123))

(check-equal? (bit-string-pack (bit-string (1008 : bits 10) (0 : bits 6)))
	      (bytes 252 0))

(define (pascal->string/utf-8 bs)
  (bit-string-case bs
    ([len (body : binary bytes len)]
     (bytes->string/utf-8 (bit-string-pack body)))))

(define (string->pascal/utf-8 str)
  (let ((bs (string->bytes/utf-8 str)))
    (bit-string (bytes-length bs) (bs : binary))))

(check-equal? (pascal->string/utf-8 #"\010abcdefgh") "abcdefgh")
(check-equal? (bit-string-pack (string->pascal/utf-8 "abcdefgh"))
	      #"\010abcdefgh")

(check-equal? (bit-string (49152 : big-endian)) (bytes 0))
(check-equal? (bit-string (49152 : little-endian)) (bytes 0))
(check-equal? (bit-string (49152 : bits 16 big-endian)) (bytes 192 0))
(check-equal? (bit-string (49152 : bits 16 little-endian)) (bytes 0 192))

(check-equal? (bit-string (inexact->exact 1.0)) (bytes 1))
(check-equal? (bit-string [1.0 : float]) (bytes 63 240 0 0 0 0 0 0))
(check-equal? (bit-string [1.0 : float bits 32]) (bytes 63 128 0 0))
(check-equal? (bit-string [1.0 : float little-endian]) (bytes 0 0 0 0 0 0 240 63))