test-numspell.ss
#lang scheme/base
;; See numspell.ss for legal information.
;; $Id: test-numspell.ss,v 1.3 2011/01/02 00:42:31 neilpair Exp $

(require (planet neil/testeez:1:1/testeez)
         "numspell.ss")

(testeez
 "numspell"
 ;;
 (test/equal "" (number->english 0) "zero")
 (test/equal "" (number->english 1) "one")
 (test/equal "" (number->english 2) "two")
 (test/equal "" (number->english 3) "three")
 (test/equal "" (number->english 4) "four")
 (test/equal "" (number->english 5) "five")
 (test/equal "" (number->english 6) "six")
 (test/equal "" (number->english 7) "seven")
 (test/equal "" (number->english 8) "eight")
 (test/equal "" (number->english 9) "nine")
 (test/equal "" (number->english 10) "ten")
 (test/equal "" (number->english 11) "eleven")
 (test/equal "" (number->english 12) "twelve")
 (test/equal "" (number->english 13) "thirteen")
 (test/equal "" (number->english 14) "fourteen")
 (test/equal "" (number->english 15) "fifteen")
 (test/equal "" (number->english 16) "sixteen")
 (test/equal "" (number->english 17) "seventeen")
 (test/equal "" (number->english 18) "eighteen")
 (test/equal "" (number->english 19) "nineteen")
 (test/equal "" (number->english 20) "twenty")
 (test/equal "" (number->english 21) "twenty-one")
 (test/equal "" (number->english 30) "thirty")
 (test/equal "" (number->english 40) "forty")
 (test/equal "" (number->english 50) "fifty")
 (test/equal "" (number->english 60) "sixty")
 (test/equal "" (number->english 70) "seventy")
 (test/equal "" (number->english 80) "eighty")
 (test/equal "" (number->english 90) "ninety")
 (test/equal "" (number->english 100) "one hundred")
 (test/equal "" (number->english 102) "one hundred two")
 (test/equal "" (number->english 1002) "one thousand two")
 (test/equal "" (number->english 10002) "ten thousand two")
 (test/equal "" (number->english 100002) "one hundred thousand two")
 (test/equal "" (number->english 1000002) "one million two")
 (test/equal "" (number->english 10000002) "ten million two")
 (test/equal "" (number->english 100000002) "one hundred million two")
 (test/equal "" (number->english 1000000002) "one billion two")
 (test/equal "" (number->english 1000000000002) "one trillion two")
 ;;
 (test/equal "" (number->english 100020003000) "one hundred billion twenty million three thousand")
 ;;
 (test/equal ""
             (number->english 123)
             "one hundred twenty-three")
 (test/equal ""
             (number->english 1234)
             "one thousand two hundred thirty-four")
 (test/equal ""
             (number->english 12345)
             "twelve thousand three hundred forty-five")
 (test/equal ""
             (number->english 123456)
             "one hundred twenty-three thousand four hundred fifty-six")
 (test/equal
  ""
  (number->english 1234567)
  "one million two hundred thirty-four thousand five hundred sixty-seven")
 ;;
 (test/equal
  ""
  (number->english 123456789012345678901234567890)
  "one hundred twenty-three octillion four hundred fifty-six septillion seven hundred eighty-nine sextillion twelve quintillion three hundred forty-five quadrillion six hundred seventy-eight trillion nine hundred one billion two hundred thirty-four million five hundred sixty-seven thousand eight hundred ninety")
 ;;
 (test/equal ""
             (number->english 1/3)
             "one over three")
 ;;
 (test/equal ""
             (number->english 123.0123)
             "one hundred twenty-three point zero one two three")
 ;;

 (test-define ""
              f
              (lambda (n)
                (let ((x (expt 10 n)))
                  (list (number->short-scale-english x)
                        (number->long-scale-english  x)))))

 (test/equal "" (f 3)  '("one thousand"    "one thousand"))
 (test/equal "" (f 6)  '("one million"     "one million"))
 (test/equal "" (f 9)  '("one billion"     "one thousand million"))
 (test/equal "" (f 12) '("one trillion"    "one billion"))
 (test/equal "" (f 15) '("one quadrillion" "one thousand billion"))
 (test/equal "" (f 18) '("one quintillion" "one trillion"))

 ;;

 (test/equal "" (number->english -1) "negative one")

 ;;

 (test/equal "Scheme implementation's infinity print form check"
             (let ((x (exact->inexact (expt 7 1999))))
               (if (member x
                           '(+inf.0 "#i1/0" "#{Inf}" "+#.#" "+inf" "+inf." "+inf.0"
                             "+infinity.0"))
                   'recognized
                   `(unrecognized ,x)))
             'recognized)

 ;;(test/equal ""
 ;;            (number->english (exact->inexact (expt 7 1999)))
 ;;            "infinity")

 (test/equal ""
             (sqrt -1)
             0+1i))