Concurrency

This commit is contained in:
2026-07-28 22:17:49 -04:00
parent f235a0cf78
commit 969e36c5ff
29 changed files with 2966 additions and 111 deletions
+67
View File
@@ -0,0 +1,67 @@
/// Unit tests for the Antelope lexer.
///
/// Tests tokenization of Makefile syntax: identifiers, operators,
/// variable references, comments, recipe lines, and line continuations.
module antelope.tests.parser.lexer_test;
import antelope.parser.lexer;
/// Test basic identifier and operator tokenization.
unittest
{
auto lexer = Lexer("target: prereq\n");
auto tok = lexer.nextToken();
assert(tok.type == TokenType.identifier);
assert(tok.value == "target");
tok = lexer.nextToken();
assert(tok.type == TokenType.colon);
tok = lexer.nextToken();
assert(tok.type == TokenType.identifier);
assert(tok.value == "prereq");
}
/// Test comment stripping — everything after '#' is ignored.
unittest
{
auto lexer = Lexer("VAR = value # this is a comment\n");
auto tok = lexer.nextToken();
assert(tok.type == TokenType.identifier);
assert(tok.value == "VAR");
tok = lexer.nextToken();
assert(tok.type == TokenType.equals);
tok = lexer.nextToken();
assert(tok.type == TokenType.identifier);
assert(tok.value == "value");
}
/// Test line continuation (backslash-newline).
unittest
{
auto lexer = Lexer("target: prereq1 \\\n prereq2\n");
auto tok = lexer.nextToken();
assert(tok.type == TokenType.identifier);
assert(tok.value == "target");
tok = lexer.nextToken();
assert(tok.type == TokenType.colon);
}
/// Test variable reference prefix ($).
unittest
{
auto lexer = Lexer("$(VAR)\n");
auto tok = lexer.nextToken();
assert(tok.type == TokenType.dollar);
}
/// Test recipe line detection (tab-prefixed).
unittest
{
auto lexer = Lexer("\tgcc -c hello.c\n");
auto tok = lexer.nextToken();
assert(tok.type == TokenType.recipeLine);
}
+30
View File
@@ -0,0 +1,30 @@
/// Unit tests for the Antelope parser.
///
/// Tests recursive-descent parsing of rules, variable assignments,
/// and directive blocks into the AST.
module antelope.tests.parser.parser_test;
import antelope.parser.parser;
import antelope.parser.ast;
/// Test parsing a simple rule with prerequisites and no recipe.
unittest
{
auto root = parseMakefile("target: prereq1 prereq2\n");
assert(root.type == AstType.rule_list);
assert(root.children.length == 1);
auto rule = root.children[0];
assert(rule.type == AstType.rule);
}
/// Test parsing a variable assignment.
unittest
{
auto root = parseMakefile("CC = gcc\n");
assert(root.type == AstType.rule_list);
assert(root.children.length == 1);
auto var = root.children[0];
assert(var.type == AstType.variable_assignment);
}