File: LexerTests.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (104 lines) | stat: -rw-r--r-- 3,564 bytes parent folder | download
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),
            ])
    }
}