1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
import XCTest
@testable import WIT
class LexerTests: XCTestCase {
func collectToken(_ s: String) throws -> [TokenKind] {
let cursor = Lexer.Cursor(input: s)
var lexer = Lexer(cursor: cursor)
var tokens: [TokenKind] = []
while let token = lexer.lex() {
tokens.append(token.kind)
}
return tokens
}
func testLexIdentifier() {
try XCTAssertEqual(collectToken(""), [])
try XCTAssertEqual(collectToken("_"), [.underscore])
try XCTAssertEqual(collectToken("a"), [.id])
try XCTAssertEqual(collectToken("a1"), [.id])
try XCTAssertEqual(collectToken("a1b"), [.id])
try XCTAssertEqual(collectToken("apple"), [.id])
try XCTAssertEqual(collectToken("apple-banana"), [.id])
try XCTAssertEqual(collectToken("_a_p_p_l_e_"), [.id])
try XCTAssertEqual(collectToken("アップル"), [.id])
try XCTAssertEqual(collectToken("%a"), [.explicitId])
try XCTAssertEqual(collectToken("%a-b"), [.explicitId])
try XCTAssertEqual(collectToken("%"), [.explicitId])
try XCTAssertEqual(collectToken("func-tion"), [.id])
try XCTAssertEqual(collectToken("a:"), [.id, .colon])
}
func testLexKeyword() {
try XCTAssertEqual(collectToken("func"), [.func])
try XCTAssertEqual(collectToken("func()"), [.func, .leftParen, .rightParen])
try XCTAssertEqual(collectToken("resource"), [.resource])
try XCTAssertEqual(collectToken("own"), [.own])
try XCTAssertEqual(collectToken("borrow"), [.borrow])
try XCTAssertEqual(
collectToken("own<file>"),
[.own, .lessThan, .id, .greaterThan]
)
}
func testLexInteger() {
try XCTAssertEqual(collectToken("0"), [.integer])
try XCTAssertEqual(collectToken("0123"), [.integer])
try XCTAssertEqual(collectToken("0123a"), [.integer, .id])
}
func testLexFunction() {
try XCTAssertEqual(
collectToken("stat-file: func()"),
[
.id, .colon, .func, .leftParen, .rightParen,
])
try XCTAssertEqual(
collectToken("stat-file: func(path: string)"),
[
.id, .colon, .func,
.leftParen, .id, .colon, .string_, .rightParen,
])
try XCTAssertEqual(
collectToken("stat-file: func() -> result<stat>"),
[
.id, .colon, .func, .leftParen, .rightParen,
.rArrow, .result_, .lessThan, .id, .greaterThan,
])
}
struct Span: Equatable {
let offset: Int
let length: Int
}
func tokenSpan(_ s: String) throws -> [Span] {
let cursor = Lexer.Cursor(input: s)
var lexer = Lexer(cursor: cursor)
var spans: [Span] = []
while let token = lexer.lex() {
let offset = s.distance(from: s.startIndex, to: token.textRange.lowerBound)
let length = s.distance(from: token.textRange.lowerBound, to: token.textRange.upperBound)
spans.append(Span(offset: offset, length: length))
}
return spans
}
func testTextRange() throws {
try XCTAssertEqual(tokenSpan("a"), [.init(offset: 0, length: 1)])
try XCTAssertEqual(tokenSpan("ab"), [.init(offset: 0, length: 2)])
try XCTAssertEqual(
tokenSpan("a b"),
[
.init(offset: 0, length: 1),
.init(offset: 2, length: 1),
])
}
}
|