test/test-lump.rkt
#lang racket
(provide  session-tests message-tests io-tests typed-tests
          large-data-test)
(require rackunit
 rackunit/gui
         "../lump.rkt")

(define s (new-session))

(define session-tests
  (test-suite
   "LUMP sessions"
   (test-case 
     "new-session returns a session"
   (check-true (session? s)))
   (test-case 
     "close-session returns void"
   (check-eq? (void) (close-session s)))))

(define message-tests
  (test-suite
   "LUMP messages"
   (test-case
    "new-message returns a message"
    (check-true (message? (new-message 1))))
   (test-case 
    "new-response returns a message"
    (check-true (message? (new-response 2 (new-message 1)))))
   (test-case 
    "id equality"
    (check-equal? (message-id (new-message 23)) 23))
   (test-case 
    "referer equality"
    (check-equal? (message-referer (new-message 1 #:referer 28)) 28))
   (test-case
    "no predefined referer"
    (check-false (message-referer (new-message 1))))
   (test-case
    "flags equality"
    (check-equal? (message-flags (new-message 1 #:flags 77)) 77))
   (test-case
    "argument equality"
    (check-equal? (message-args (new-message 1 23 "String1" "String2"))
                  '(23 "String1" "String2")))))

(define io-tests
  (test-suite
   "LUMP input/output"
   (let* ((snd-msg (new-message 1 #:referer 44 46272627826 "String1" "String2" #("Nested1" "Nested2") 'hello #t))
          (rec-msg (with-input-from-bytes 
                    (with-output-to-bytes 
                     (lambda ()
                       (write-message s snd-msg)))
                    (lambda ()
                      (read-message)))))
     (test-case 
      "transmission id equality"
      (check-equal? (message-id rec-msg) (message-id snd-msg)))
     (test-case
      "transmission referer equality"
      (check-equal? (message-referer rec-msg) (message-referer snd-msg)))
     (test-case
      "transmission argument equality"
      (check-equal? (message-args rec-msg) (message-args snd-msg))))))

(define typed-tests
  (test-suite
   "LUMP typed data"
    (let* ((snd-msg (new-message 1
                                 (typed type:uint8 127)
                                 (typed type:int16 -32768)
                                 (typed type:uint16 65535)
                                 (typed type:int32 -2147483648)
                                 (typed type:uint32 4294967295)
                                 (typed type:int64 -9223372036854775808)
                                 (typed type:uint64 18446744073709551615)))
          (rec-msg (with-input-from-bytes 
                    (with-output-to-bytes 
                     (lambda ()
                       (write-message s snd-msg)))
                    (lambda ()
                      (read-message)))))
      (test-case
       "transmission of typed data types"
       (check-equal? (message-args rec-msg) (map untype (message-args snd-msg)))))))

(define large-data-test
  (test-suite
   "LUMP large data"
   (let* ((snd-msg (apply new-message (build-list 65535 values)))
          (rec-msg (with-input-from-bytes 
                    (with-output-to-bytes 
                     (lambda ()
                       (write-message s snd-msg)))
                    (lambda ()
                      (read-message))))
          (snd-msg2 (new-message 1 (make-bytes  65536)))
          (rec-msg2 (with-input-from-bytes 
                    (with-output-to-bytes 
                     (lambda ()
                       (write-message s snd-msg2)))
                    (lambda ()
                      (read-message)))))
     (test-case
      "transmission of many arguments"
      (check-equal? (message-args rec-msg) (message-args snd-msg)))
     (test-case 
      "transmission of large argument"
      (check-equal? (message-args rec-msg2) (message-args snd-msg2))))))