(define (dlang/integer in)
(define text "")
- (if (char-numeric? (buf-lookahead! in 1))
+ (if (and
+ (not (eof-object? (buf-lookahead! in 1)))
+ (char-numeric? (buf-lookahead! in 1)))
(while (char-numeric? (buf-lookahead! in 1))
(set! text (string-append text (string (buf-consume! in)))))
- (error "Expected a number."))
+ (error "Expected an integer"))
text)
(define (dlang/decimal in)
(match in #\e) (match in #\E))
(dlang/integer in "")))
-(define (dlang/character in str)
+(define (dlang/character in)
(token 'character
(string-append
(string (match in #\'))
(string (buf-consume! in))
(string (match in #\')) )))
-(define (dlang/string in str)
+(define (dlang/string in)
(token 'string
(string-append
(string (match in #\"))
(accumulate-till in string-append "" #\")
(string (match in #\")) )))
-(define (dlang/symbol in str)
+(define (dlang/symbol in)
(token 'symbol
(string-append
- (match in #\$)
+ (string (char-match in #\$))
(token-text (dlang/id in)))))
(define (dlang/id in)
; dlang/integer
;------------------------------------------------------------------------------
+(def-test "dlang/integer should recognize an integer of length one"
+ (call-with-input-string "0"
+ (lambda (input)
+ (define buffer (buf input read-char))
+ (define result (dlang/integer buffer))
+ (and (string? result)
+ (equal? "0" result)))))
+
+(def-test "dlang/integer should recognize an integer of length two"
+ (call-with-input-string "01"
+ (lambda (input)
+ (define buffer (buf input read-char))
+ (define result (dlang/integer buffer))
+ (and (string? result)
+ (equal? "01" result)))))
+
+(def-test "dlang/integer should recognize an integer of length three"
+ (call-with-input-string "012"
+ (lambda (input)
+ (define buffer (buf input read-char))
+ (define result (dlang/integer buffer))
+ (and (string? result)
+ (equal? "012" result)))))
+
+(def-test "dlang/integer should error when no integer in input"
+ (call-with-input-string "abc"
+ (lambda (input)
+ (define buffer (buf input read-char))
+ (check-error "Expected an integer"
+ (dlang/integer buffer)))))
+
+(def-test "dlang/integer should error when EOF"
+ (call-with-input-string "abc"
+ (lambda (input)
+ (define buffer (buf input read-char))
+ (check-error "Expected an integer"
+ (dlang/integer buffer)))))
; dlang/decimal
;------------------------------------------------------------------------------
; dlang/symbol
;------------------------------------------------------------------------------
-(def-test "dlang/symbol should error when no name given for a symbol"
- (call-with-input-string "$"
- (lambda (input) '())))
-
-(def-test "dlang/symbol should error when not a symbol"
- (call-with-input-string "abc"
- (lambda (input) '())))
-
(def-test "dlang/symbol should recognize a symbol of length one"
(call-with-input-string "$a"
- (lambda (input) '())))
+ (lambda (input)
+ (define buffer (buf input read-char))
+ (define result (dlang/symbol buffer))
+ (and (token? result)
+ (equal? 'symbol (token-type result))
+ (equal? "$a" (token-text result))))))
(def-test "dlang/symbol should recognize a symbol of length two"
(call-with-input-string "$ab"
- (lambda (input) '())))
+ (lambda (input)
+ (define buffer (buf input read-char))
+ (define result (dlang/symbol buffer))
+ (and (token? result)
+ (equal? 'symbol (token-type result))
+ (equal? "$ab" (token-text result))))))
(def-test "dlang/symbol should recognize a symbol of length three"
(call-with-input-string "$abc"
- (lambda (input) '())))
+ (lambda (input)
+ (define buffer (buf input read-char))
+ (define result (dlang/symbol buffer))
+ (and (token? result)
+ (equal? 'symbol (token-type result))
+ (equal? "$abc" (token-text result))))))
(def-test "dlang/symbol should stop recognition on EOF"
(call-with-input-string "$abc"
- (lambda (input) '())))
+ (lambda (input)
+ (define buffer (buf input read-char))
+ (define result (dlang/symbol buffer))
+ (and (token? result)
+ (equal? 'symbol (token-type result))
+ (equal? "$abc" (token-text result))))))
(def-test "dlang/symbol should stop recognition on whitespace"
(call-with-input-string "$abc "
- (lambda (input) '())))
+ (lambda (input)
+ (define buffer (buf input read-char))
+ (define result (dlang/symbol buffer))
+ (and (token? result)
+ (equal? 'symbol (token-type result))
+ (equal? "$abc" (token-text result))))))
+
+(def-test "dlang/symbol should error when no name given for a symbol"
+ (call-with-input-string "$"
+ (lambda (input)
+ (define buffer (buf input read-char))
+ (check-error "An Id was expected but none found."
+ (dlang/symbol buffer)))))
+
+(def-test "dlang/symbol should error when EOF"
+ (call-with-input-string ""
+ (lambda (input)
+ (define buffer (buf input read-char))
+ (check-error "Expected '$', received EOF instead"
+ (dlang/symbol buffer)))))
; dlang/id
;------------------------------------------------------------------------------
(call-with-input-string ""
(lambda (input)
(define buffer (buf input read-char))
- (define result (dlang/id buffer))
- (equal? result "An Id was expected but none found.") )))
+ (check-error "An Id was expected but none found."
+ (dlang/id buffer)))))