AtlatestRepositorysigil-format
sigil-format / tree / testtest-format.sgl
1
(import (sigil test)2
(sigil format))4
;; ============================================================5
;; Tokenizer6
;; ============================================================8
(test-group "tokenize"9
(test "simple expression tokens"10
(let* ((result (tokenize "(+ 1 2)" "test.sgl"))11
(chars (tokenize-result-chars result))12
(tokens (tokenize-result-tokens result)))13
;; Should have lparen, symbol, whitespace, number, whitespace, number, rparen, eof14
(assert-equal 'lparen (token-type (car tokens)))15
(assert-equal "(" (token-value (car tokens) chars))))17
(test "string token"18
(let* ((result (tokenize "\"hello\"" "test.sgl"))19
(chars (tokenize-result-chars result))20
(tokens (tokenize-result-tokens result)))21
(assert-equal 'string (token-type (car tokens)))22
(assert-equal "\"hello\"" (token-value (car tokens) chars))))24
(test "hash forms"25
(let* ((result (tokenize "#t #f" "test.sgl"))26
(tokens (tokenize-result-tokens result)))27
(assert-equal 'hash-t (token-type (car tokens)))))29
(test "comment token"30
(let* ((result (tokenize "; a comment\n" "test.sgl"))31
(tokens (tokenize-result-tokens result)))32
(assert-equal 'comment (token-type (car tokens)))))34
(test "line/column tracking"35
(let* ((result (tokenize "(define x 1)" "test.sgl"))36
(tokens (tokenize-result-tokens result)))37
(assert-equal 1 (token-line (car tokens)))38
(assert-equal 1 (token-column (car tokens)))))40
(test "char literal with double-quote delimiter"41
(let* ((result (tokenize "#\\\"" "test.sgl"))42
(chars (tokenize-result-chars result))43
(tokens (tokenize-result-tokens result)))44
(assert-equal 'char (token-type (car tokens)))45
(assert-equal "#\\\"" (token-value (car tokens) chars))))47
(test "char literal with open-paren delimiter"48
(let* ((result (tokenize "#\\(" "test.sgl"))49
(chars (tokenize-result-chars result))50
(tokens (tokenize-result-tokens result)))51
(assert-equal 'char (token-type (car tokens)))52
(assert-equal "#\\(" (token-value (car tokens) chars))))54
(test "char literal with close-paren delimiter"55
(let* ((result (tokenize "#\\)" "test.sgl"))56
(chars (tokenize-result-chars result))57
(tokens (tokenize-result-tokens result)))58
(assert-equal 'char (token-type (car tokens)))59
(assert-equal "#\\)" (token-value (car tokens) chars))))61
(test "char literal with semicolon delimiter"62
(let* ((result (tokenize "#\\;" "test.sgl"))63
(chars (tokenize-result-chars result))64
(tokens (tokenize-result-tokens result)))65
(assert-equal 'char (token-type (car tokens)))66
(assert-equal "#\\;" (token-value (car tokens) chars)))))68
;; ============================================================69
;; format-string70
;; ============================================================72
(test-group "format-string balanced code"73
(test "already-balanced code returned with success"74
(let ((result (format-string "(define x 1)" "test.sgl")))75
(assert-true (format-result-success result))76
(assert-equal '() (format-result-inferences result))))78
(test "balanced multi-line code"79
(let ((result (format-string "(define (foo x)\n (+ x 1))" "test.sgl")))80
(assert-true (format-result-success result)))))82
(test-group "format-string missing parens"83
(test "unclosed define gets closing paren inferred"84
(let ((result (format-string "(define (foo\n (+ 1 2)" "test.sgl")))85
(assert-true (format-result-success result))86
(assert-true (> (length (format-result-inferences result)) 0))))88
(test "paren-inference has correct fields"89
(let* ((result (format-string "(define (foo\n (+ 1 2)" "test.sgl"))90
(infs (format-result-inferences result)))91
(when (> (length infs) 0)92
(let ((inf (car infs)))93
(assert-true (paren-inference? inf))94
(assert-true (number? (paren-inference-line inf)))95
(assert-true (string? (paren-inference-reason inf))))))))97
(test-group "format-string with char literals"98
(test "no false inferences from delimiter char literals"99
(let ((result (format-string "(define (foo x)\n (if (eq? x #\\\")\n #\\(\n #\\)))" "test.sgl")))100
(assert-true (format-result-success result))101
(assert-equal '() (format-result-inferences result)))))103
(test-group "format-string errors"104
(test "mismatched brackets produce errors"105
(let ((result (format-string "(define x]" "test.sgl")))106
(assert-false (format-result-success result))107
(assert-true (> (length (format-result-errors result)) 0)))))109
;; ============================================================110
;; Result accessors111
;; ============================================================113
(test-group "UTF-8 preservation"114
(test "formatter preserves multi-byte UTF-8 characters"115
(let ((result (format-string "(define x \"\x2192; \x2713; \x2501;\")" "test.sgl")))116
(assert-true (format-result-success result))117
(assert-equal "(define x \"\x2192; \x2713; \x2501;\")"118
(format-result-output result)))))120
(test-group "format result accessors"121
(test "format-result-file"122
(let ((result (format-string "(+ 1 2)" "myfile.sgl")))123
(assert-equal "myfile.sgl" (format-result-file result))))125
(test "format-result-output contains formatted code"126
(let ((result (format-string "(+ 1 2)" "test.sgl")))127
(assert-true (string? (format-result-output result)))))129
(test "format-result-warnings is a list"130
(let ((result (format-string "(+ 1 2)" "test.sgl")))131
(assert-true (list? (format-result-warnings result))))))133
(run-tests)