55 lines
2.1 KiB
Swift
55 lines
2.1 KiB
Swift
import XCTest
|
|
@testable import KiteCore
|
|
|
|
final class ReaderTests: XCTestCase {
|
|
private func readOne(_ src: String) throws -> Value {
|
|
let forms = try Reader(src).readProgram()
|
|
XCTAssertEqual(forms.count, 1)
|
|
return forms[0]
|
|
}
|
|
|
|
func testIntegerAndReal() throws {
|
|
XCTAssertEqual(displayString(try readOne("42")), "42")
|
|
XCTAssertEqual(displayString(try readOne("-7")), "-7")
|
|
XCTAssertEqual(displayString(try readOne("3.5")), "3.5")
|
|
}
|
|
|
|
func testRational() throws {
|
|
XCTAssertEqual(displayString(try readOne("3/2")), "3/2")
|
|
XCTAssertEqual(displayString(try readOne("6/2")), "3")
|
|
}
|
|
|
|
func testStringAndChar() throws {
|
|
XCTAssertEqual(writeString(try readOne("\"hi\\nthere\"")), "\"hi\\nthere\"")
|
|
XCTAssertEqual(writeString(try readOne("#\\a")), "#\\a")
|
|
XCTAssertEqual(writeString(try readOne("#\\space")), "#\\space")
|
|
XCTAssertEqual(writeString(try readOne("#\\newline")), "#\\newline")
|
|
}
|
|
|
|
func testBooleans() throws {
|
|
if case .bool(true) = try readOne("#t") {} else { XCTFail("not #t") }
|
|
if case .bool(false) = try readOne("#f") {} else { XCTFail("not #f") }
|
|
}
|
|
|
|
func testListAndDotted() throws {
|
|
XCTAssertEqual(writeString(try readOne("(1 2 3)")), "(1 2 3)")
|
|
XCTAssertEqual(writeString(try readOne("(1 . 2)")), "(1 . 2)")
|
|
XCTAssertEqual(writeString(try readOne("(a (b c) d)")), "(a (b c) d)")
|
|
}
|
|
|
|
func testQuoteSugar() throws {
|
|
XCTAssertEqual(writeString(try readOne("'x")), "(quote x)")
|
|
XCTAssertEqual(writeString(try readOne("`x")), "(quasiquote x)")
|
|
XCTAssertEqual(writeString(try readOne(",x")), "(unquote x)")
|
|
XCTAssertEqual(writeString(try readOne(",@x")), "(unquote-splicing x)")
|
|
}
|
|
|
|
func testComments() throws {
|
|
let forms = try Reader("; a comment\n(+ 1 2) #| block |# 5 #;(ignored) 9").readProgram()
|
|
XCTAssertEqual(forms.count, 3)
|
|
XCTAssertEqual(writeString(forms[0]), "(+ 1 2)")
|
|
XCTAssertEqual(displayString(forms[1]), "5")
|
|
XCTAssertEqual(displayString(forms[2]), "9")
|
|
}
|
|
}
|