test-bencode.rkt
#lang racket/base
;; $Id: test-bencode.rkt,v 1.4 2012-02-14 02:52:42 user Exp $

(require (planet neil/testeez:1:2)
         "bencode.rkt")

(define (%bencode:unbencode-string str)
  ;; TODO: This is at least internal-use-only because reading bytes from a
  ;; string is even messier, portability-wise.
  (let* ((port   (open-input-string str))
         (result (unbencode port)))
    (close-input-port port)
    result))

(testeez
 "bencode"

 (test/equal "" (%bencode:unbencode-string "4:spam") '(#"spam"))

 (test/equal "" (%bencode:unbencode-string "i3e")  '(3))
 (test/equal "" (%bencode:unbencode-string "i-3e") '(-3))
 (test/equal "" (%bencode:unbencode-string "i0e")  '(0))

 (test/equal "" (%bencode:unbencode-string "i123e")  '(123))
 (test/equal "" (%bencode:unbencode-string "i-123e") '(-123))

 (test/equal ""
             (%bencode:unbencode-string "l4:spam4:eggse")
             '((#"spam" #"eggs")))

 (test/equal ""
             (%bencode:unbencode-string "d3:cow3:moo4:spam4:eggse")
             '((dictionary (#"cow" . #"moo") (#"spam" . #"eggs"))))

 (test/equal ""
             (%bencode:unbencode-string "d4:spaml1:a1:bee")
             '((dictionary (#"spam" . (#"a" #"b")))))

 (test/equal ""
             (%bencode:unbencode-string
              (string-append "4:spami3ei-3ei0ei123ei-123el4:spam4:eggsed3:co"
                             "w3:moo4:spam4:eggsed4:spaml1:a1:bee"))
             '(#"spam" 3 -3 0 123 -123 (#"spam" #"eggs")
               (dictionary (#"cow". #"moo") (#"spam" . #"eggs"))
               (dictionary (#"spam". (#"a" #"b"))))))