diff --git a/sugar/test/main.rkt b/sugar/test/main.rkt
index 8b32f41..15126d6 100644
--- a/sugar/test/main.rkt
+++ b/sugar/test/main.rkt
@@ -1,222 +1,259 @@
#lang racket/base
-(require racket/include rackunit sugar racket/list net/url racket/set racket/match)
+(require (for-syntax racket/base racket/syntax))
+
+(define-syntax (eval-as-untyped stx)
+ (syntax-case stx ()
+ [(_ exprs ...)
+ (with-syntax ([sym (generate-temporary)])
+ #'(begin
+ (module sym racket/base
+ (require rackunit sugar net/url racket/list racket/set racket/match)
+ exprs ...)
+ (require 'sym)))]))
+
+(define-syntax (eval-as-typed stx)
+ (syntax-case stx ()
+ [(_ exprs ...)
+ (with-syntax ([sym (generate-temporary)])
+ #'(begin
+ (module sym typed/racket/base
+ (require typed/rackunit typed/sugar typed/net/url racket/list racket/list racket/set racket/match)
+ exprs ...)
+ (require 'sym)))]))
+
+(define-syntax-rule (eval-as-typed-and-untyped exprs ...)
+ (begin
+ (eval-as-typed exprs ...)
+ (eval-as-untyped exprs ...)))
;; begin shared typed / untyped tests
-
-(check-equal? (->int 42) 42)
-(check-equal? (->int 42.1) 42)
-(check-equal? (->int 42+3i) 42)
-(check-equal? (->int "42") 42)
-(check-equal? (->int '42) 42)
-(check-equal? (->int (string->path "42")) 42)
-(check-equal? (->int #\A) 65)
-(check-equal? (->int (make-list 42 null)) 42)
-
-(check-equal? (->string "foo") "foo")
-(check-equal? (->string '()) "")
-(check-equal? (->string (void)) "")
-(check-equal? (->string 'foo) "foo")
-(check-equal? (->string 123) "123")
-;(check-equal? (->string (string->url "foo/bar.html")) "foo/bar.html")
-(define file-name-as-text "foo.txt")
-(check-equal? (->string (string->path file-name-as-text)) file-name-as-text)
-(check-equal? (->string #\¶) "¶")
-
-(check-equal? (->path "foo") (string->path "foo"))
-(check-equal? (->path 'foo) (string->path "foo"))
-(check-equal? (->path 123) (string->path "123"))
-(check-equal? (->path (string->url "foo/bar.html")) (string->path "foo/bar.html"))
-
-(check-equal? (->list '(1 2 3)) '(1 2 3))
-(check-equal? (->list (list->vector '(1 2 3))) '(1 2 3))
-(check-equal? (->list (set 1 2 3)) '(3 2 1))
-(check-equal? (->list "foo") (list "foo"))
-
-(check-true (->boolean #t))
-(check-false (->boolean #f))
-(check-true (->boolean "#f"))
-(check-true (->boolean "foo"))
-(check-true (->boolean '()))
-(check-true (->boolean '(1 2 3)))
-
-
-(check-equal? (len '(1 2 3)) 3)
-(check-not-equal? (len '(1 2)) 3) ; len 2
-(check-equal? (len "foo") 3)
-(check-not-equal? (len "fo") 3) ; len 2
-(check-equal? (len 'foo) 3)
-(check-not-equal? (len 'fo) 3) ; len 2
-(check-equal? (len (list->vector '(1 2 3))) 3)
-(check-not-equal? (len (list->vector '(1 2))) 3) ; len 2
-(check-equal? (len (set 1 2 3)) 3)
-(check-not-equal? (len (set 1 2)) 3) ; len 2
-(check-equal? (len (make-hash '((a . 1) (b . 2) (c . 3)))) 3)
-(check-not-equal? (len (make-hash '((a . 1) (b . 2)))) 3) ; len 2
-
-
-
-
-
-(check-true ("foobar" . starts-with? . "foo"))
-(check-true ("foobar" . starts-with? . "f"))
-(check-true ("foobar" . starts-with? . "foobar"))
-(check-false ("foobar" . starts-with? . "bar"))
-(check-false ("foobar" . starts-with? . "."))
-(check-true ("foobar" . ends-with? . "bar"))
-(check-true ("foobar" . ends-with? . "r"))
-(check-true ("foobar" . ends-with? . "foobar"))
-(check-false ("foobar" . ends-with? . "foo"))
-
-
-(check-true (members-unique? '(a b c)))
-(check-false (members-unique? '(a b c c)))
-(check-true (members-unique? "zoey"))
-(check-false (members-unique? "zooey"))
-
-(check-equal? (trimf (list 4 1 2 3 4) even?) '(1 2 3))
-(check-equal? (trimf (list 1 3 2 4 5 6 8 9 13) odd?) '(2 4 5 6 8))
-(check-equal? (filter-split '("foo" " " "bar" "\n" "\n" "ino") (λ(x) (< (string-length x) 3))) '(("foo")("bar")("ino")))
-(check-equal? (filter-split '(1 2 3 4 5 6) even?) '((1)(3)(5)))
-
-
-(define foo-path-strings '("foo" "foo.txt" "foo.bar" "foo.bar.txt"))
-(match-define (list foo-path foo.txt-path foo.bar-path foo.bar.txt-path) (map ->path foo-path-strings))
-;; test the sample paths before using them for other tests
-(define foo-paths (list foo-path foo.txt-path foo.bar-path foo.bar.txt-path))
-(for-each check-equal? (map ->string foo-paths) foo-path-strings)
-
-
-(check-false (has-ext? foo-path 'txt))
-(check-true (foo.txt-path . has-ext? . 'txt))
-(check-true ((->path "foo.TXT") . has-ext? . 'txt))
-(check-true (has-ext? foo.bar.txt-path 'txt))
-(check-false (foo.bar.txt-path . has-ext? . 'doc)) ; wrong extension
-
-
-(check-equal? (get-ext (->path "foo.txt")) "txt")
-(check-false (get-ext "foo"))
-
-(check-equal? (add-ext (string->path "foo") "txt") (string->path "foo.txt"))
-(check-equal? (remove-ext foo-path) foo-path)
-(check-equal? (remove-ext (->path ".foo.txt")) (->path ".foo.txt"))
-(check-equal? (remove-ext foo.txt-path) foo-path)
-(check-equal? (remove-ext foo.bar.txt-path) foo.bar-path)
-(check-not-equal? (remove-ext foo.bar.txt-path) foo-path) ; does not remove all extensions
-
-
-(check-equal? (remove-ext* foo-path) foo-path)
-(check-equal? (remove-ext* foo.txt-path) foo-path)
-(check-equal? (remove-ext* (->path ".foo.txt")) (->path ".foo.txt"))
-(check-not-equal? (remove-ext* foo.bar.txt-path) foo.bar-path) ; removes more than one ext
-(check-equal? (remove-ext* foo.bar.txt-path) foo-path)
-
-
-(check-true (starts-with? "foobar" "foo"))
-(check-true (starts-with? "foobar" "foobar"))
-(check-false (starts-with? "foobar" "zam"))
-(check-false (starts-with? "foobar" "foobars"))
-(check-true (ends-with? "foobar" "bar"))
-(check-false (ends-with? "foobar" "zam"))
-(check-true (ends-with? "foobar" "foobar"))
-(check-false (ends-with? "foobar" "foobars"))
-(check-true (capitalized? "Brennan"))
-(check-false (capitalized? "foobar"))
-
-(check-equal? (slice-at (range 5) 1) '((0) (1) (2) (3) (4)))
-(check-equal? (slice-at (range 5) 2) '((0 1) (2 3) (4)))
-(check-equal? (slice-at (range 5) 2 #t) '((0 1) (2 3)))
-(check-equal? (slice-at (range 5) 3) '((0 1 2) (3 4)))
-(check-equal? (slice-at (range 5) 3 #t) '((0 1 2)))
-
-(check-equal? (slicef-at (range 5) even?) '((0 1) (2 3) (4)))
-(check-equal? (slicef-at (range 5) odd?) '((0) (1 2) (3 4)))
-(check-equal? (slicef-at (range 5) odd? #t) '((1 2) (3 4)))
-(check-equal? (slicef-at (range 5) procedure?) '((0 1 2 3 4)))
-
-(check-equal? (slicef-at '(1 2 2 1 2) even?) '((1) (2) (2 1) (2)))
-(check-equal? (slicef-at '(1 2 2 1 2) even? #t) '((2) (2 1) (2)))
-
-(check-equal? (sublist (range 5) 0 0) '())
-(check-equal? (sublist (range 5) 0 1) '(0))
-(check-equal? (sublist (range 5) 0 5) '(0 1 2 3 4))
-
-(check-equal? (break-at '(5 6 7 8) '()) '((5 6 7 8)))
-(check-equal? (break-at '(5 6 7 8) '(0)) '((5 6 7 8)))
-(check-equal? (break-at '(5 6 7 8) '(1 2 3)) '((5) (6) (7) (8)))
-(check-equal? (break-at '(5 6 7 8) '(1 3)) '((5) (6 7) (8)))
-(check-equal? (break-at '(5 6 7 8) '(1)) (break-at '(5 6 7 8) 1))
-
-(define xs (range 5))
-(check-equal? (map (λ(a b c) (list a b c)) (shift xs -1) (shift xs 0) (shift xs 1)) '((1 0 #f) (2 1 0) (3 2 1) (4 3 2) (#f 4 3)))
-(check-equal? (shift xs '(-1 0 1) 'boing) `((1 2 3 4 boing) ,xs (boing 0 1 2 3)))
-(check-equal? (shift xs 5 0) (make-list 5 0))
-(check-exn exn:fail? (λ() (shift xs -10)))
-
-;;;;; end common tests
-
-(check-exn exn:fail? (λ _ (slice-at (range 5) 0))) ; needs a positive integer as second arg
-(check-exn exn:fail? (λ _ (slicef-at (range 5) 3))) ; needs a procedure as second arg
-
-(check-equal? (get '(0 1 2 3 4 5) 2) 2)
-(check-exn exn:fail? (λ() (get '(0 1 2 3 4 5) 100))) ; index too big
-(check-equal? (get `(0 1 ,(list 2) 3 4 5) 2) (list 2))
-(check-equal? (get '(0 1 2 3 4 5) 0 2) '(0 1))
-(check-equal? (get (list->vector '(0 1 2 3 4 5)) 2) 2)
-(check-equal? (get (list->vector'(0 1 2 3 4 5)) 0 2) (list->vector '(0 1)))
-(check-equal? (get "purple" 2) "r")
-(check-equal? (get "purple" 0 2) "pu")
-(check-equal? (get 'purple 2) 'r)
-(check-equal? (get 'purple 0 2) 'pu)
-(check-equal? (get (string->path "/root/foo/bar/file.txt") 2) (string->path "foo"))
-(check-equal? (get (string->path "/root/foo/bar/file.txt") 0 2) (list (string->path "/") (string->path "root")))
-(check-equal? (get (make-hash `((a . ,(list 1)) (b . ,(list 2)) (c . ,(list 3)))) 'a) (list 1))
-(check-exn exn:fail? (λ() (get (make-hash `((a . ,(list 1)) (b . ,(list 2)) (c . ,(list 3)))) 'z))) ; nonexistent key
-
-(check-equal? (get (string->path "/root/foo/bar/file.txt") 1) (string->path "root"))
-(check-equal? (get (string->path "/root/foo/bar/file.txt") 0 3)
- (map string->path '("/" "root" "foo")))
-
-(check-equal? (get (make-hash '((a . 1) (b . 2) (c . 3))) 'b) 2)
-
-(check-true (2 . in? . '(1 2 3)))
-(check-false (4 . in? . '(1 2 3)))
-(check-true (2 . in? . (list->vector '(1 2 3))))
-(check-false (4 . in? . (list->vector '(1 2 3))))
-(check-true ('a . in? . (make-hash '((a . 1) (b . 2) (c . 3)))))
-(check-false ('x . in? . (make-hash '((a . 1) (b . 2) (c . 3)))))
-(check-true ("o" . in? . "foobar"))
-(check-false ("z" . in? . "foobar"))
-(check-true ('o . in? . 'foobar))
-(check-false ('z . in? . 'foobar))
-(check-true ("F" . in? . #\F))
-
-(check-true (in? "foo" (string->path "/root/foo/bar/file.txt")))
-(check-false (in? "zam" (string->path "/root/foo/bar/file.txt")))
-
-(define ys (range 5))
-(check-equal? (values->list (shift/values ys '(-1 0 1) 'boing)) `((1 2 3 4 boing) ,xs (boing 0 1 2 3)))
-
-
-(require xml)
-(define str "\nhello world")
-(define-values (str-prolog str-doc) (xml-string->xexprs str))
-(check-equal? str-prolog (prolog (list (p-i (location 1 0 1) (location 1 38 39) 'xml "version=\"1.0\" encoding=\"utf-8\"")) #f null))
-(check-equal? str-doc '(root () "hello world"))
-(check-equal? (xexprs->xml-string str-prolog str-doc) str)
-
-
-(module include-test racket/base
- (require sugar/include)
- (include-without-lang-line "source.rkt")
- (provide included-symbol))
-
-(require 'include-test)
-(check-equal? included-symbol 'bar)
-
-(module no-lang-line-include-test racket/base
- (require sugar/include)
- (include-without-lang-line "no-lang-line-source.txt")
- (provide no-lang-symbol))
-
-(require 'no-lang-line-include-test)
-(check-equal? no-lang-symbol 'bar)
\ No newline at end of file
+(eval-as-typed-and-untyped
+ (check-equal? (->int 42) 42)
+ (check-equal? (->int 42.1) 42)
+ (check-equal? (->int 42+3i) 42)
+ (check-equal? (->int "42") 42)
+ (check-equal? (->int '42) 42)
+ (check-equal? (->int (string->path "42")) 42)
+ (check-equal? (->int #\A) 65)
+ (check-equal? (->int (make-list 42 null)) 42)
+
+ (check-equal? (->string "foo") "foo")
+ (check-equal? (->string '()) "")
+ (check-equal? (->string (void)) "")
+ (check-equal? (->string 'foo) "foo")
+ (check-equal? (->string 123) "123")
+ ;(check-equal? (->string (string->url "foo/bar.html")) "foo/bar.html")
+ (define file-name-as-text "foo.txt")
+ (check-equal? (->string (string->path file-name-as-text)) file-name-as-text)
+ (check-equal? (->string #\¶) "¶")
+
+ (check-equal? (->path "foo") (string->path "foo"))
+ (check-equal? (->path 'foo) (string->path "foo"))
+ (check-equal? (->path 123) (string->path "123"))
+ (check-equal? (->path (string->url "foo/bar.html")) (string->path "foo/bar.html"))
+
+ (check-equal? (->list '(1 2 3)) '(1 2 3))
+ (check-equal? (->list (list->vector '(1 2 3))) '(1 2 3))
+ (check-equal? (->list (set 1 2 3)) '(3 2 1))
+ (check-equal? (->list "foo") (list "foo"))
+
+ (check-true (->boolean #t))
+ (check-false (->boolean #f))
+ (check-true (->boolean "#f"))
+ (check-true (->boolean "foo"))
+ (check-true (->boolean '()))
+ (check-true (->boolean '(1 2 3)))
+
+
+ (check-equal? (len '(1 2 3)) 3)
+ (check-not-equal? (len '(1 2)) 3) ; len 2
+ (check-equal? (len "foo") 3)
+ (check-not-equal? (len "fo") 3) ; len 2
+ (check-equal? (len 'foo) 3)
+ (check-not-equal? (len 'fo) 3) ; len 2
+ (check-equal? (len (list->vector '(1 2 3))) 3)
+ (check-not-equal? (len (list->vector '(1 2))) 3) ; len 2
+ (check-equal? (len (set 1 2 3)) 3)
+ (check-not-equal? (len (set 1 2)) 3) ; len 2
+ (check-equal? (len (make-hash '((a . 1) (b . 2) (c . 3)))) 3)
+ (check-not-equal? (len (make-hash '((a . 1) (b . 2)))) 3) ; len 2
+
+
+
+
+
+ (check-true ("foobar" . starts-with? . "foo"))
+ (check-true ("foobar" . starts-with? . "f"))
+ (check-true ("foobar" . starts-with? . "foobar"))
+ (check-false ("foobar" . starts-with? . "bar"))
+ (check-false ("foobar" . starts-with? . "."))
+ (check-true ("foobar" . ends-with? . "bar"))
+ (check-true ("foobar" . ends-with? . "r"))
+ (check-true ("foobar" . ends-with? . "foobar"))
+ (check-false ("foobar" . ends-with? . "foo"))
+
+
+ (check-true (members-unique? '(a b c)))
+ (check-false (members-unique? '(a b c c)))
+ (check-true (members-unique? "zoey"))
+ (check-false (members-unique? "zooey"))
+
+ (check-equal? (trimf (list 4 1 2 3 4) even?) '(1 2 3))
+ (check-equal? (trimf (list 1 3 2 4 5 6 8 9 13) odd?) '(2 4 5 6 8))
+ ;(check-equal? (filter-split '("foo" " " "bar" "\n" "\n" "ino") (λ(x) (< (string-length x) 3))) '(("foo")("bar")("ino")))
+ (check-equal? (filter-split '(1 2 3 4 5 6) even?) '((1)(3)(5)))
+
+
+ (define foo-path-strings '("foo" "foo.txt" "foo.bar" "foo.bar.txt"))
+ (match-define (list foo-path foo.txt-path foo.bar-path foo.bar.txt-path) (map ->path foo-path-strings))
+ ;; test the sample paths before using them for other tests
+ (define foo-paths (list foo-path foo.txt-path foo.bar-path foo.bar.txt-path))
+ (for-each check-equal? (map ->string foo-paths) foo-path-strings)
+
+
+ (check-false (has-ext? foo-path 'txt))
+ (check-true (foo.txt-path . has-ext? . 'txt))
+ (check-true ((->path "foo.TXT") . has-ext? . 'txt))
+ (check-true (has-ext? foo.bar.txt-path 'txt))
+ (check-false (foo.bar.txt-path . has-ext? . 'doc)) ; wrong extension
+
+
+ (check-equal? (get-ext (->path "foo.txt")) "txt")
+ (check-false (get-ext "foo"))
+
+ (check-equal? (add-ext (string->path "foo") "txt") (string->path "foo.txt"))
+ (check-equal? (remove-ext foo-path) foo-path)
+ (check-equal? (remove-ext (->path ".foo.txt")) (->path ".foo.txt"))
+ (check-equal? (remove-ext foo.txt-path) foo-path)
+ (check-equal? (remove-ext foo.bar.txt-path) foo.bar-path)
+ (check-not-equal? (remove-ext foo.bar.txt-path) foo-path) ; does not remove all extensions
+
+
+ (check-equal? (remove-ext* foo-path) foo-path)
+ (check-equal? (remove-ext* foo.txt-path) foo-path)
+ (check-equal? (remove-ext* (->path ".foo.txt")) (->path ".foo.txt"))
+ (check-not-equal? (remove-ext* foo.bar.txt-path) foo.bar-path) ; removes more than one ext
+ (check-equal? (remove-ext* foo.bar.txt-path) foo-path)
+
+
+ (check-true (starts-with? "foobar" "foo"))
+ (check-true (starts-with? "foobar" "foobar"))
+ (check-false (starts-with? "foobar" "zam"))
+ (check-false (starts-with? "foobar" "foobars"))
+ (check-true (ends-with? "foobar" "bar"))
+ (check-false (ends-with? "foobar" "zam"))
+ (check-true (ends-with? "foobar" "foobar"))
+ (check-false (ends-with? "foobar" "foobars"))
+ (check-true (capitalized? "Brennan"))
+ (check-false (capitalized? "foobar"))
+
+ (check-equal? (slice-at (range 5) 1) '((0) (1) (2) (3) (4)))
+ (check-equal? (slice-at (range 5) 2) '((0 1) (2 3) (4)))
+ (check-equal? (slice-at (range 5) 2 #t) '((0 1) (2 3)))
+ (check-equal? (slice-at (range 5) 3) '((0 1 2) (3 4)))
+ (check-equal? (slice-at (range 5) 3 #t) '((0 1 2)))
+
+ (check-equal? (slicef-at (range 5) even?) '((0 1) (2 3) (4)))
+ (check-equal? (slicef-at (range 5) odd?) '((0) (1 2) (3 4)))
+ (check-equal? (slicef-at (range 5) odd? #t) '((1 2) (3 4)))
+ (check-equal? (slicef-at (range 5) procedure?) '((0 1 2 3 4)))
+
+ (check-equal? (slicef-at '(1 2 2 1 2) even?) '((1) (2) (2 1) (2)))
+ (check-equal? (slicef-at '(1 2 2 1 2) even? #t) '((2) (2 1) (2)))
+
+ (check-equal? (sublist (range 5) 0 0) '())
+ (check-equal? (sublist (range 5) 0 1) '(0))
+ (check-equal? (sublist (range 5) 0 5) '(0 1 2 3 4))
+
+ (check-equal? (break-at '(5 6 7 8) '()) '((5 6 7 8)))
+ (check-equal? (break-at '(5 6 7 8) '(0)) '((5 6 7 8)))
+ (check-equal? (break-at '(5 6 7 8) '(1 2 3)) '((5) (6) (7) (8)))
+ (check-equal? (break-at '(5 6 7 8) '(1 3)) '((5) (6 7) (8)))
+ (check-equal? (break-at '(5 6 7 8) '(1)) (break-at '(5 6 7 8) 1))
+
+ (define xs (range 5))
+ (check-equal? (map (λ(a b c) (list a b c)) (shift xs -1) (shift xs 0) (shift xs 1)) '((1 0 #f) (2 1 0) (3 2 1) (4 3 2) (#f 4 3)))
+ (check-equal? (shift xs '(-1 0 1) 'boing) `((1 2 3 4 boing) ,xs (boing 0 1 2 3)))
+ (check-equal? (shift xs 5 0) (make-list 5 0))
+ (check-exn exn:fail? (λ() (shift xs -10)))
+
+ ;;;;; end common tests
+ )
+
+
+(eval-as-untyped
+ (check-exn exn:fail? (λ _ (slice-at (range 5) 0))) ; needs a positive integer as second arg
+ (check-exn exn:fail? (λ _ (slicef-at (range 5) 3))) ; needs a procedure as second arg
+
+ (check-equal? (get '(0 1 2 3 4 5) 2) 2)
+ (check-exn exn:fail? (λ() (get '(0 1 2 3 4 5) 100))) ; index too big
+ (check-equal? (get `(0 1 ,(list 2) 3 4 5) 2) (list 2))
+ (check-equal? (get '(0 1 2 3 4 5) 0 2) '(0 1))
+ (check-equal? (get (list->vector '(0 1 2 3 4 5)) 2) 2)
+ (check-equal? (get (list->vector'(0 1 2 3 4 5)) 0 2) (list->vector '(0 1)))
+ (check-equal? (get "purple" 2) "r")
+ (check-equal? (get "purple" 0 2) "pu")
+ (check-equal? (get 'purple 2) 'r)
+ (check-equal? (get 'purple 0 2) 'pu)
+ (check-equal? (get (string->path "/root/foo/bar/file.txt") 2) (string->path "foo"))
+ (check-equal? (get (string->path "/root/foo/bar/file.txt") 0 2) (list (string->path "/") (string->path "root")))
+ (check-equal? (get (make-hash `((a . ,(list 1)) (b . ,(list 2)) (c . ,(list 3)))) 'a) (list 1))
+ (check-exn exn:fail? (λ() (get (make-hash `((a . ,(list 1)) (b . ,(list 2)) (c . ,(list 3)))) 'z))) ; nonexistent key
+
+ (check-equal? (get (string->path "/root/foo/bar/file.txt") 1) (string->path "root"))
+ (check-equal? (get (string->path "/root/foo/bar/file.txt") 0 3)
+ (map string->path '("/" "root" "foo")))
+
+ (check-equal? (get (make-hash '((a . 1) (b . 2) (c . 3))) 'b) 2)
+
+ (check-true (2 . in? . '(1 2 3)))
+ (check-false (4 . in? . '(1 2 3)))
+ (check-true (2 . in? . (list->vector '(1 2 3))))
+ (check-false (4 . in? . (list->vector '(1 2 3))))
+ (check-true ('a . in? . (make-hash '((a . 1) (b . 2) (c . 3)))))
+ (check-false ('x . in? . (make-hash '((a . 1) (b . 2) (c . 3)))))
+ (check-true ("o" . in? . "foobar"))
+ (check-false ("z" . in? . "foobar"))
+ (check-true ('o . in? . 'foobar))
+ (check-false ('z . in? . 'foobar))
+ (check-true ("F" . in? . #\F))
+
+ (check-true (in? "foo" (string->path "/root/foo/bar/file.txt")))
+ (check-false (in? "zam" (string->path "/root/foo/bar/file.txt")))
+
+ (define xs (range 5))
+ (define ys (range 5))
+ (check-equal? (values->list (shift/values ys '(-1 0 1) 'boing)) `((1 2 3 4 boing) ,xs (boing 0 1 2 3)))
+
+
+ (require xml)
+ (define str "\nhello world")
+ (define-values (str-prolog str-doc) (xml-string->xexprs str))
+ (check-equal? str-prolog (prolog (list (p-i (location 1 0 1) (location 1 38 39) 'xml "version=\"1.0\" encoding=\"utf-8\"")) #f null))
+ (check-equal? str-doc '(root () "hello world"))
+ (check-equal? (xexprs->xml-string str-prolog str-doc) str)
+
+
+ (module include-test racket/base
+ (require sugar/include)
+ (include-without-lang-line "source.rkt")
+ (provide included-symbol))
+
+ (require 'include-test)
+ (check-equal? included-symbol 'bar)
+
+ (module no-lang-line-include-test racket/base
+ (require sugar/include)
+ (include-without-lang-line "no-lang-line-source.txt")
+ (provide no-lang-symbol))
+
+ (require 'no-lang-line-include-test)
+ (check-equal? no-lang-symbol 'bar))
+
+
+
+#|
+;; todo: revise `check-typing-fails` to make it compatible with 6.0
+(check-typing-fails (slice-at (range 5) 0)) ; needs a positive integer as second arg
+(check-typing-fails (slicef-at (range 5) 3)) ; needs a procedure as second arg
+|#
\ No newline at end of file
diff --git a/typed/sugar/coerce.rkt b/typed/sugar/coerce.rkt
index 29e2d50..a288f83 100644
--- a/typed/sugar/coerce.rkt
+++ b/typed/sugar/coerce.rkt
@@ -5,13 +5,13 @@
(require "len.rkt") ; want relative path-spec for bilingual conversion
(define-syntax-rule (make-coercion-error-handler target-format x)
- (λ(e) (error (format "Can’t convert ~s to ~a" x target-format))))
+ (λ(e) (error (string->symbol (format "->~a" target-format)) (format "Can’t convert ~s to ~a" x target-format))))
-(define-type Intable (U Lengthable Number String Symbol Char Path))
+(define-type Intable (U Number String Symbol Char Path Lengthable))
(define/typed+provide (->int x)
(Intable -> Integer)
- (with-handlers ([exn:fail? (make-coercion-error-handler 'integer x)])
+ (with-handlers ([exn:fail? (make-coercion-error-handler 'int x)])
(cond
[(or (integer? x) (real? x)) (assert (inexact->exact (floor x)) integer?)]
[(complex? x) (->int (real-part x))]
diff --git a/typed/sugar/len.rkt b/typed/sugar/len.rkt
index 7f6fa0c..5f1794d 100644
--- a/typed/sugar/len.rkt
+++ b/typed/sugar/len.rkt
@@ -3,7 +3,7 @@
(require typed/sugar/define)
(provide Lengthable)
-(define-type Lengthable (U (Listof Any) String Symbol Path (Vectorof Any) HashTableTop (Setof Any) (Sequenceof Any)))
+(define-type Lengthable (U (Listof Any) String Symbol Path (Vectorof Any) HashTableTop (Setof Any)))
(define/typed+provide (len x)
(Lengthable -> Nonnegative-Integer)
diff --git a/typed/sugar/test/main.rkt b/typed/sugar/test/main.rkt
deleted file mode 100644
index 8433bbd..0000000
--- a/typed/sugar/test/main.rkt
+++ /dev/null
@@ -1,163 +0,0 @@
-#lang typed/racket/base
-(require racket/include typed/rackunit typed/net/url racket/set racket/list racket/match)
-(require typed/sugar)
-
-;; begin shared typed / untyped tests
-
-(check-equal? (->int 42) 42)
-(check-equal? (->int 42.1) 42)
-(check-equal? (->int 42+3i) 42)
-(check-equal? (->int "42") 42)
-(check-equal? (->int '42) 42)
-(check-equal? (->int (string->path "42")) 42)
-(check-equal? (->int #\A) 65)
-(check-equal? (->int (make-list 42 null)) 42)
-
-(check-equal? (->string "foo") "foo")
-(check-equal? (->string '()) "")
-(check-equal? (->string (void)) "")
-(check-equal? (->string 'foo) "foo")
-(check-equal? (->string 123) "123")
-;(check-equal? (->string (string->url "foo/bar.html")) "foo/bar.html")
-(define file-name-as-text "foo.txt")
-(check-equal? (->string (string->path file-name-as-text)) file-name-as-text)
-(check-equal? (->string #\¶) "¶")
-
-(check-equal? (->path "foo") (string->path "foo"))
-(check-equal? (->path 'foo) (string->path "foo"))
-(check-equal? (->path 123) (string->path "123"))
-(check-equal? (->path (string->url "foo/bar.html")) (string->path "foo/bar.html"))
-
-(check-equal? (->list '(1 2 3)) '(1 2 3))
-(check-equal? (->list (list->vector '(1 2 3))) '(1 2 3))
-(check-equal? (->list (set 1 2 3)) '(3 2 1))
-(check-equal? (->list "foo") (list "foo"))
-
-(check-true (->boolean #t))
-(check-false (->boolean #f))
-(check-true (->boolean "#f"))
-(check-true (->boolean "foo"))
-(check-true (->boolean '()))
-(check-true (->boolean '(1 2 3)))
-
-
-(check-equal? (len '(1 2 3)) 3)
-(check-not-equal? (len '(1 2)) 3) ; len 2
-(check-equal? (len "foo") 3)
-(check-not-equal? (len "fo") 3) ; len 2
-(check-equal? (len 'foo) 3)
-(check-not-equal? (len 'fo) 3) ; len 2
-(check-equal? (len (list->vector '(1 2 3))) 3)
-(check-not-equal? (len (list->vector '(1 2))) 3) ; len 2
-(check-equal? (len (set 1 2 3)) 3)
-(check-not-equal? (len (set 1 2)) 3) ; len 2
-(check-equal? (len (make-hash '((a . 1) (b . 2) (c . 3)))) 3)
-(check-not-equal? (len (make-hash '((a . 1) (b . 2)))) 3) ; len 2
-
-
-
-
-
-(check-true ("foobar" . starts-with? . "foo"))
-(check-true ("foobar" . starts-with? . "f"))
-(check-true ("foobar" . starts-with? . "foobar"))
-(check-false ("foobar" . starts-with? . "bar"))
-(check-false ("foobar" . starts-with? . "."))
-(check-true ("foobar" . ends-with? . "bar"))
-(check-true ("foobar" . ends-with? . "r"))
-(check-true ("foobar" . ends-with? . "foobar"))
-(check-false ("foobar" . ends-with? . "foo"))
-
-
-(check-true (members-unique? '(a b c)))
-(check-false (members-unique? '(a b c c)))
-(check-true (members-unique? "zoey"))
-(check-false (members-unique? "zooey"))
-
-(check-equal? (trimf (list 4 1 2 3 4) even?) '(1 2 3))
-(check-equal? (trimf (list 1 3 2 4 5 6 8 9 13) odd?) '(2 4 5 6 8))
-(check-equal? (filter-split '("foo" " " "bar" "\n" "\n" "ino") (λ:([x : String]) (< (string-length x) 3))) '(("foo")("bar")("ino")))
-(check-equal? (filter-split '(1 2 3 4 5 6) even?) '((1)(3)(5)))
-
-
-(define foo-path-strings '("foo" "foo.txt" "foo.bar" "foo.bar.txt"))
-(match-define (list foo-path foo.txt-path foo.bar-path foo.bar.txt-path) (map ->path foo-path-strings))
-;; test the sample paths before using them for other tests
-(define foo-paths (list foo-path foo.txt-path foo.bar-path foo.bar.txt-path))
-(for-each check-equal? (map ->string foo-paths) foo-path-strings)
-
-
-(check-false (has-ext? foo-path 'txt))
-(check-true (foo.txt-path . has-ext? . 'txt))
-(check-true ((->path "foo.TXT") . has-ext? . 'txt))
-(check-true (has-ext? foo.bar.txt-path 'txt))
-(check-false (foo.bar.txt-path . has-ext? . 'doc)) ; wrong extension
-
-
-(check-equal? (get-ext (->path "foo.txt")) "txt")
-(check-false (get-ext "foo"))
-
-(check-equal? (add-ext (string->path "foo") "txt") (string->path "foo.txt"))
-(check-equal? (remove-ext foo-path) foo-path)
-(check-equal? (remove-ext (->path ".foo.txt")) (->path ".foo.txt"))
-(check-equal? (remove-ext foo.txt-path) foo-path)
-(check-equal? (remove-ext foo.bar.txt-path) foo.bar-path)
-(check-not-equal? (remove-ext foo.bar.txt-path) foo-path) ; does not remove all extensions
-
-
-(check-equal? (remove-ext* foo-path) foo-path)
-(check-equal? (remove-ext* foo.txt-path) foo-path)
-(check-equal? (remove-ext* (->path ".foo.txt")) (->path ".foo.txt"))
-(check-not-equal? (remove-ext* foo.bar.txt-path) foo.bar-path) ; removes more than one ext
-(check-equal? (remove-ext* foo.bar.txt-path) foo-path)
-
-
-(check-true (starts-with? "foobar" "foo"))
-(check-true (starts-with? "foobar" "foobar"))
-(check-false (starts-with? "foobar" "zam"))
-(check-false (starts-with? "foobar" "foobars"))
-(check-true (ends-with? "foobar" "bar"))
-(check-false (ends-with? "foobar" "zam"))
-(check-true (ends-with? "foobar" "foobar"))
-(check-false (ends-with? "foobar" "foobars"))
-(check-true (capitalized? "Brennan"))
-(check-false (capitalized? "foobar"))
-
-(check-equal? (slice-at (range 5) 1) '((0) (1) (2) (3) (4)))
-(check-equal? (slice-at (range 5) 2) '((0 1) (2 3) (4)))
-(check-equal? (slice-at (range 5) 2 #t) '((0 1) (2 3)))
-(check-equal? (slice-at (range 5) 3) '((0 1 2) (3 4)))
-(check-equal? (slice-at (range 5) 3 #t) '((0 1 2)))
-
-(check-equal? (slicef-at (range 5) even?) '((0 1) (2 3) (4)))
-(check-equal? (slicef-at (range 5) odd?) '((0) (1 2) (3 4)))
-(check-equal? (slicef-at (range 5) odd? #t) '((1 2) (3 4)))
-(check-equal? (slicef-at (range 5) procedure?) '((0 1 2 3 4)))
-
-(check-equal? (slicef-at '(1 2 2 1 2) even?) '((1) (2) (2 1) (2)))
-(check-equal? (slicef-at '(1 2 2 1 2) even? #t) '((2) (2 1) (2)))
-
-(check-equal? (sublist (range 5) 0 0) '())
-(check-equal? (sublist (range 5) 0 1) '(0))
-(check-equal? (sublist (range 5) 0 5) '(0 1 2 3 4))
-
-(check-equal? (break-at '(5 6 7 8) '()) '((5 6 7 8)))
-(check-equal? (break-at '(5 6 7 8) '(0)) '((5 6 7 8)))
-(check-equal? (break-at '(5 6 7 8) '(1 2 3)) '((5) (6) (7) (8)))
-(check-equal? (break-at '(5 6 7 8) '(1 3)) '((5) (6 7) (8)))
-(check-equal? (break-at '(5 6 7 8) '(1)) (break-at '(5 6 7 8) 1))
-
-(define xs (range 5))
-(check-equal? (map (λ(a b c) (list a b c)) (shift xs -1) (shift xs 0) (shift xs 1)) '((1 0 #f) (2 1 0) (3 2 1) (4 3 2) (#f 4 3)))
-(check-equal? (shift xs '(-1 0 1) 'boing) `((1 2 3 4 boing) ,xs (boing 0 1 2 3)))
-(check-equal? (shift xs 5 0) (make-list 5 0))
-(check-exn exn:fail? (λ() (shift xs -10)))
-
-;; end shared tests
-
-
-#|
-;; todo: revise `check-typing-fails` to make it compatible with 6.0
-(check-typing-fails (slice-at (range 5) 0)) ; needs a positive integer as second arg
-(check-typing-fails (slicef-at (range 5) 3)) ; needs a procedure as second arg
-|#
\ No newline at end of file
diff --git a/typed/sugar/test/no-lang-line-source.txt b/typed/sugar/test/no-lang-line-source.txt
deleted file mode 100644
index 56e53a3..0000000
--- a/typed/sugar/test/no-lang-line-source.txt
+++ /dev/null
@@ -1 +0,0 @@
-(define no-lang-symbol 'bar)
\ No newline at end of file
diff --git a/typed/sugar/test/source.rkt b/typed/sugar/test/source.rkt
deleted file mode 100644
index d82d324..0000000
--- a/typed/sugar/test/source.rkt
+++ /dev/null
@@ -1,3 +0,0 @@
-#lang typed/racket
-
-(define included-symbol 'bar)
\ No newline at end of file
diff --git a/typed/sugar/test/test-require-modes.rkt b/typed/sugar/test/test-require-modes.rkt
deleted file mode 100644
index c33f0b9..0000000
--- a/typed/sugar/test/test-require-modes.rkt
+++ /dev/null
@@ -1,29 +0,0 @@
-#lang racket/base
-(require rackunit)
-
-(module trb typed/racket/base
- (require typed/sugar/list typed/rackunit)
- (provide (all-defined-out))
- ;; (trimf odd? '(1 2 3)) ; type error
- (define foo (trimf '(1 2 3) odd?))
- (check-equal? foo '(2)))
-
-(module rb racket/base
- (require (submod sugar/list safe) rackunit)
- (provide (all-defined-out))
- (check-exn exn:fail:contract? (λ _ (trimf odd? '(1 2 3)))) ; fails at trimf
- (define foo (trimf '(1 2 3) odd?))
- (check-equal? foo '(2)))
-
-(module rbu racket/base
- (require sugar/list rackunit)
- (provide (all-defined-out))
- (check-exn exn:fail:contract? (λ _ (trimf odd? '(1 2 3)))) ; fails at dropf
- (define foo (trimf '(1 2 3) odd?))
- (check-equal? foo '(2)))
-
-(require (prefix-in trb: 'trb))
-(require (prefix-in rb: 'rb))
-(require (prefix-in rbu: 'rbu))
-
-(check-true (andmap (λ(val) (equal? val '(2))) (list trb:foo rb:foo rbu:foo)))
\ No newline at end of file