aboutsummaryrefslogtreecommitdiff
path: root/src/z/js/parser/root.zig
blob: 6d41c7bc5eaa536ed362558946a69e5db3cde8af (plain)
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
const std = @import("std");

pub const lexical_grammar = @import("lexical_grammar.zig");
pub const ast = @import("ast.zig");
pub const syntactic_grammar = @import("syntactic_grammar.zig");
pub const Result = @import("result.zig").Result;
pub const Parser = @import("parser.zig").Parser;

test "simple literal" {
    const source = "42;";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 1);
    try std.testing.expect(result.body[0].data == .expr);
}

test "variable declaration" {
    const source = "var x = 1;";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 1);
    try std.testing.expect(result.body[0].data == .variable);
}

test "function declaration" {
    const source = "function foo() { return 1; }";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 1);
    try std.testing.expect(result.body[0].data == .function);
}

test "if statement" {
    const source = "if (x > 0) { x = 1; } else { x = 2; }";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 1);
    try std.testing.expect(result.body[0].data == .@"if");
}

test "binary expression" {
    const source = "a + b * c;";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 1);
}

test "arrow function" {
    const source = "const f = (x) => x + 1;";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 1);
}

test "object literal" {
    const source = "var obj = { a: 1, b: 2 };";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 1);
}

test "class declaration" {
    const source = "class Foo { constructor() { } }";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 1);
}

test "for loop" {
    const source = "for (var i = 0; i < 10; i++) { break; }";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 1);
}

test "try catch" {
    const source = "try { x; } catch (e) { y; }";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 1);
}

test "multiple statements" {
    const source = "var a = 1; var b = 2; var c = a + b;";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 3);
}

test "array literal with spread" {
    const source = "var arr = [1, ...rest, 3];";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 1);
}

test "template literal" {
    const source = "const s = `hello ${name} world`;";
    const result = try syntactic_grammar.parse(source);
    try std.testing.expect(result.body.len == 1);
}

test {
    _ = std.testing.refAllDecls(@This());
}