refactor: fix tests to new compiler context
This commit is contained in:
parent
d0feb04b55
commit
56b840e09e
@ -2,7 +2,6 @@ const std = @import("std");
|
|||||||
const assert = std.debug.assert;
|
const assert = std.debug.assert;
|
||||||
const token = @import("./token.zig");
|
const token = @import("./token.zig");
|
||||||
const utils = @import("./utils.zig");
|
const utils = @import("./utils.zig");
|
||||||
const errors = @import("errors");
|
|
||||||
const context = @import("context");
|
const context = @import("context");
|
||||||
|
|
||||||
const Token = token.Token;
|
const Token = token.Token;
|
||||||
|
@ -2,7 +2,6 @@ const std = @import("std");
|
|||||||
const assert = std.debug.assert;
|
const assert = std.debug.assert;
|
||||||
const token = @import("./token.zig");
|
const token = @import("./token.zig");
|
||||||
const utils = @import("./utils.zig");
|
const utils = @import("./utils.zig");
|
||||||
const errors = @import("errors");
|
|
||||||
const context = @import("context");
|
const context = @import("context");
|
||||||
|
|
||||||
const Token = token.Token;
|
const Token = token.Token;
|
||||||
|
@ -10,7 +10,6 @@ const string = @import("string.zig");
|
|||||||
const grouping = @import("grouping.zig");
|
const grouping = @import("grouping.zig");
|
||||||
const punctuation = @import("punctiation.zig");
|
const punctuation = @import("punctiation.zig");
|
||||||
|
|
||||||
const errors = @import("errors");
|
|
||||||
const context = @import("context");
|
const context = @import("context");
|
||||||
|
|
||||||
pub const TokenType = token.TokenType;
|
pub const TokenType = token.TokenType;
|
||||||
|
@ -2,7 +2,6 @@ const std = @import("std");
|
|||||||
const assert = std.debug.assert;
|
const assert = std.debug.assert;
|
||||||
const token = @import("./token.zig");
|
const token = @import("./token.zig");
|
||||||
const utils = @import("./utils.zig");
|
const utils = @import("./utils.zig");
|
||||||
const errors = @import("errors");
|
|
||||||
const context = @import("context");
|
const context = @import("context");
|
||||||
|
|
||||||
const Token = token.Token;
|
const Token = token.Token;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const lexic = @import("lexic");
|
const lexic = @import("lexic");
|
||||||
const errors = @import("errors");
|
|
||||||
const context = @import("context");
|
const context = @import("context");
|
||||||
|
|
||||||
const Token = lexic.Token;
|
const Token = lexic.Token;
|
||||||
@ -32,8 +31,6 @@ test "should parse expression" {
|
|||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "322";
|
const input = "322";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
@ -50,8 +47,6 @@ test "should fail on non expression" {
|
|||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "identifier";
|
const input = "identifier";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const lexic = @import("lexic");
|
const lexic = @import("lexic");
|
||||||
const errors = @import("errors");
|
|
||||||
const context = @import("context");
|
const context = @import("context");
|
||||||
|
|
||||||
const expression = @import("./expression.zig");
|
const expression = @import("./expression.zig");
|
||||||
@ -68,9 +67,9 @@ pub const Module = struct {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn deinit(self: @This()) void {
|
pub fn deinit(self: @This(), ctx: *context.CompilerContext) void {
|
||||||
for (self.statements.items) |stmt| {
|
for (self.statements.items) |stmt| {
|
||||||
stmt.deinit();
|
stmt.deinit(ctx);
|
||||||
}
|
}
|
||||||
self.statements.deinit();
|
self.statements.deinit();
|
||||||
}
|
}
|
||||||
@ -84,29 +83,24 @@ test "should parse a single statement" {
|
|||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "var my_variable = 322";
|
const input = "var my_variable = 322";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
var module: Module = undefined;
|
var module: Module = undefined;
|
||||||
_ = try module.init(&tokens, 0, std.testing.allocator, &error_list);
|
_ = try module.init(&tokens, 0, &ctx);
|
||||||
|
defer module.deinit(&ctx);
|
||||||
defer module.deinit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test "should clean memory if a statement parsing fails after one item has been inserted" {
|
test "should clean memory if a statement parsing fails after one item has been inserted" {
|
||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "var my_variable = 322 unrelated()";
|
const input = "var my_variable = 322 unrelated()";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
var module: Module = undefined;
|
var module: Module = undefined;
|
||||||
_ = module.init(&tokens, 0, std.testing.allocator, &error_list) catch {
|
_ = module.init(&tokens, 0, &ctx) catch {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
defer module.deinit();
|
defer module.deinit(&ctx);
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ const expression = @import("expression.zig");
|
|||||||
const types = @import("./types.zig");
|
const types = @import("./types.zig");
|
||||||
const utils = @import("./utils.zig");
|
const utils = @import("./utils.zig");
|
||||||
const variable = @import("./variable.zig");
|
const variable = @import("./variable.zig");
|
||||||
const errors = @import("errors");
|
|
||||||
const context = @import("context");
|
const context = @import("context");
|
||||||
|
|
||||||
const TokenStream = types.TokenStream;
|
const TokenStream = types.TokenStream;
|
||||||
@ -59,14 +58,12 @@ test "should parse a variable declaration statement" {
|
|||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "var my_variable = 322";
|
const input = "var my_variable = 322";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
var statement: Statement = undefined;
|
var statement: Statement = undefined;
|
||||||
_ = try statement.init(&tokens, 0, undefined, std.testing.allocator);
|
_ = try statement.init(&tokens, 0, &ctx);
|
||||||
defer statement.deinit();
|
defer statement.deinit(&ctx);
|
||||||
|
|
||||||
switch (statement.value) {
|
switch (statement.value) {
|
||||||
.variableBinding => |v| {
|
.variableBinding => |v| {
|
||||||
@ -80,17 +77,16 @@ test "should fail on other constructs" {
|
|||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "a_function_call(322)";
|
const input = "a_function_call(322)";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
var statement: Statement = undefined;
|
var statement: Statement = undefined;
|
||||||
const result = try statement.init(&tokens, 0, undefined, std.testing.allocator);
|
const result = try statement.init(&tokens, 0, &ctx);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
// good path
|
// good path
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
defer statement.deinit(&ctx);
|
||||||
|
|
||||||
try std.testing.expect(false);
|
try std.testing.expect(false);
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ const lexic = @import("lexic");
|
|||||||
const expression = @import("expression.zig");
|
const expression = @import("expression.zig");
|
||||||
const types = @import("./types.zig");
|
const types = @import("./types.zig");
|
||||||
const utils = @import("./utils.zig");
|
const utils = @import("./utils.zig");
|
||||||
const errors = @import("errors");
|
|
||||||
const context = @import("context");
|
const context = @import("context");
|
||||||
|
|
||||||
const TokenStream = types.TokenStream;
|
const TokenStream = types.TokenStream;
|
||||||
@ -91,14 +90,12 @@ test "should parse a minimal var" {
|
|||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "var my_variable = 322";
|
const input = "var my_variable = 322";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
var binding: VariableBinding = undefined;
|
var binding: VariableBinding = undefined;
|
||||||
_ = try binding.init(&tokens, 0, undefined, std.testing.allocator);
|
_ = try binding.init(&tokens, 0, &ctx);
|
||||||
defer binding.deinit();
|
defer binding.deinit(&ctx);
|
||||||
|
|
||||||
try std.testing.expectEqual(true, binding.is_mutable);
|
try std.testing.expectEqual(true, binding.is_mutable);
|
||||||
try std.testing.expect(binding.datatype == null);
|
try std.testing.expect(binding.datatype == null);
|
||||||
@ -115,13 +112,11 @@ test "should return null if stream doesnt start with var" {
|
|||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "different_token_stream()";
|
const input = "different_token_stream()";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
var binding: VariableBinding = undefined;
|
var binding: VariableBinding = undefined;
|
||||||
if (try binding.init(&tokens, 0, undefined, std.testing.allocator)) |_| {
|
if (try binding.init(&tokens, 0, &ctx)) |_| {
|
||||||
try std.testing.expect(false);
|
try std.testing.expect(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -130,15 +125,14 @@ test "should fail if the identifier is missing" {
|
|||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "var ";
|
const input = "var ";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
var error_data: errors.ErrorData = undefined;
|
|
||||||
var binding: VariableBinding = undefined;
|
var binding: VariableBinding = undefined;
|
||||||
_ = binding.init(&tokens, 0, &error_data, std.testing.allocator) catch |err| {
|
_ = binding.init(&tokens, 0, &ctx) catch |err| {
|
||||||
defer error_data.deinit();
|
try std.testing.expectEqual(1, ctx.errors.items.len);
|
||||||
|
const error_data = ctx.errors.items[0];
|
||||||
|
|
||||||
try std.testing.expectEqual(ParseError.Error, err);
|
try std.testing.expectEqual(ParseError.Error, err);
|
||||||
try std.testing.expectEqualStrings("Incomplete variable declaration", error_data.reason);
|
try std.testing.expectEqualStrings("Incomplete variable declaration", error_data.reason);
|
||||||
try std.testing.expectEqual(0, error_data.start_position);
|
try std.testing.expectEqual(0, error_data.start_position);
|
||||||
@ -149,6 +143,7 @@ test "should fail if the identifier is missing" {
|
|||||||
try std.testing.expectEqual(3, l.end);
|
try std.testing.expectEqual(3, l.end);
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
defer binding.deinit(&ctx);
|
||||||
|
|
||||||
try std.testing.expect(false);
|
try std.testing.expect(false);
|
||||||
}
|
}
|
||||||
@ -157,16 +152,15 @@ test "should fail if there is not an identifier after var" {
|
|||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "var 322";
|
const input = "var 322";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
var binding: VariableBinding = undefined;
|
var binding: VariableBinding = undefined;
|
||||||
_ = binding.init(&tokens, 0, undefined, std.testing.allocator) catch |err| {
|
_ = binding.init(&tokens, 0, &ctx) catch |err| {
|
||||||
try std.testing.expectEqual(ParseError.Error, err);
|
try std.testing.expectEqual(ParseError.Error, err);
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
defer binding.deinit(&ctx);
|
||||||
|
|
||||||
try std.testing.expect(false);
|
try std.testing.expect(false);
|
||||||
}
|
}
|
||||||
@ -175,16 +169,15 @@ test "should fail if the equal sign is missing" {
|
|||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "var my_id ";
|
const input = "var my_id ";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
var binding: VariableBinding = undefined;
|
var binding: VariableBinding = undefined;
|
||||||
_ = binding.init(&tokens, 0, undefined, std.testing.allocator) catch |err| {
|
_ = binding.init(&tokens, 0, &ctx) catch |err| {
|
||||||
try std.testing.expectEqual(ParseError.Error, err);
|
try std.testing.expectEqual(ParseError.Error, err);
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
defer binding.deinit(&ctx);
|
||||||
|
|
||||||
try std.testing.expect(false);
|
try std.testing.expect(false);
|
||||||
}
|
}
|
||||||
@ -193,16 +186,15 @@ test "should fail if the equal sign is not found" {
|
|||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "var my_id is string";
|
const input = "var my_id is string";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
var binding: VariableBinding = undefined;
|
var binding: VariableBinding = undefined;
|
||||||
_ = binding.init(&tokens, 0, undefined, std.testing.allocator) catch |err| {
|
_ = binding.init(&tokens, 0, &ctx) catch |err| {
|
||||||
try std.testing.expectEqual(ParseError.Error, err);
|
try std.testing.expectEqual(ParseError.Error, err);
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
defer binding.deinit(&ctx);
|
||||||
|
|
||||||
try std.testing.expect(false);
|
try std.testing.expect(false);
|
||||||
}
|
}
|
||||||
@ -211,16 +203,15 @@ test "should fail if the expression parsing fails" {
|
|||||||
var ctx = context.CompilerContext.init(std.testing.allocator);
|
var ctx = context.CompilerContext.init(std.testing.allocator);
|
||||||
defer ctx.deinit();
|
defer ctx.deinit();
|
||||||
const input = "var my_id = ehhh";
|
const input = "var my_id = ehhh";
|
||||||
var error_list = std.ArrayList(errors.ErrorData).init(std.testing.allocator);
|
|
||||||
defer error_list.deinit();
|
|
||||||
const tokens = try lexic.tokenize(input, &ctx);
|
const tokens = try lexic.tokenize(input, &ctx);
|
||||||
defer tokens.deinit();
|
defer tokens.deinit();
|
||||||
|
|
||||||
var binding: VariableBinding = undefined;
|
var binding: VariableBinding = undefined;
|
||||||
_ = binding.init(&tokens, 0, undefined, std.testing.allocator) catch |err| {
|
_ = binding.init(&tokens, 0, &ctx) catch |err| {
|
||||||
try std.testing.expectEqual(ParseError.Error, err);
|
try std.testing.expectEqual(ParseError.Error, err);
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
defer binding.deinit(&ctx);
|
||||||
|
|
||||||
try std.testing.expect(false);
|
try std.testing.expect(false);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user