add skipped tests that fail in prep for consituent tree

This commit is contained in:
Emil Lerch 2025-09-20 17:15:35 -07:00
parent dcb4c7bf51
commit 87ee0f9580
Signed by: lobo
GPG key ID: A7B62D657EF764F8
2 changed files with 64 additions and 0 deletions

View file

@ -533,6 +533,28 @@ test "processCommand with word replacement like to light" {
try std.testing.expectEqualStrings("192.168.1.101", test_device_entry.value_ptr.*);
try std.testing.expectEqual(DeviceAction.off, test_action);
}
test "processCommand with word replacement like to light - three words" {
var devices = std.StringHashMap([]const u8).init(std.testing.allocator);
defer devices.deinit();
if (true) return error.SkipZigTest;
try devices.put("jack bedroom light", "192.168.1.101");
var parser = try pos.Parser.init(std.testing.allocator);
defer parser.deinit();
const sentence = "turn off jack bedroom like";
const sentence_z = try std.testing.allocator.dupeZ(u8, sentence);
defer std.testing.allocator.free(sentence_z);
const ll = std.testing.log_level;
std.testing.log_level = .debug;
defer std.testing.log_level = ll;
try processCommand(std.testing.allocator, sentence_z, &parser, &devices);
try std.testing.expectEqualStrings("192.168.1.101", test_device_entry.value_ptr.*);
try std.testing.expectEqual(DeviceAction.off, test_action);
}
test "processCommand no match found" {
var devices = std.StringHashMap([]const u8).init(std.testing.allocator);

View file

@ -45,6 +45,7 @@ pub const ParseTree = struct {
if (std.mem.endsWith(u8, word, ".v")) {
// adjective or noun
for (self.links) |l| {
// This should be looking through the consituent tree
// We're looking for a modifying verb, see:
// https://www.link.cs.cmu.edu/link/dict/section-MV.html
if (@as(usize, l.left_index) == i and
@ -71,6 +72,7 @@ pub const ParseTree = struct {
pub fn sentenceObject(self: *ParseTree) ![][]const u8 {
var al: std.ArrayList([]const u8) = .{};
defer al.deinit(self.allocator);
// var noun: ?usize = null;
for (self.words, 0..) |word, i| {
if (std.mem.endsWith(u8, word, ".n")) {
// adjective or noun
@ -96,6 +98,21 @@ pub const ParseTree = struct {
}
return al.toOwnedSlice(self.allocator);
}
// TODO: This should be a format function
pub fn printTree(self: *const ParseTree, writer: *std.Io.Writer) !void {
try writer.writeAll("Parse Tree:\n");
try writer.writeAll("Words: ");
for (self.words) |word| {
try writer.print("'{s}' ", .{word});
}
try writer.print("\n\nLinks ({} total):\n", .{self.links.len});
for (self.links, 0..) |link, i| {
try writer.print(" [{d}] '{s}' --{s}--> '{s}'\n", .{ i, link.left_word, link.label, link.right_word });
}
try writer.writeAll("\n");
}
};
pub const Parser = struct {
@ -295,3 +312,28 @@ test "real usage" {
try std.testing.expectEqualStrings("bedroom", sentence_object[0]);
try std.testing.expectEqualStrings("light", sentence_object[1]);
}
test "real usage - jack" {
var parser = try Parser.init(std.testing.allocator);
defer parser.deinit();
if (true) return error.SkipZigTest;
var tree = try parser.parse("turn on jack bedroom light");
defer tree.deinit();
var stderr_writer = std.fs.File.stderr().writer(&.{});
const stderr = &stderr_writer.interface;
try tree.printTree(stderr); // well, this is stupid. We shall fix later
try std.testing.expect(tree.words.len == 7); // 5 + LEFT_WALL / RIGHT_WALL
try std.testing.expectEqualStrings("turn", tree.firstVerb().?);
const sentence_action = try tree.sentenceAction();
defer std.testing.allocator.free(sentence_action);
try std.testing.expect(sentence_action.len == 2);
try std.testing.expectEqualStrings("turn", sentence_action[0]);
try std.testing.expectEqualStrings("on", sentence_action[1]);
const sentence_object = try tree.sentenceObject();
defer std.testing.allocator.free(sentence_object);
try std.testing.expect(sentence_object.len == 3);
try std.testing.expectEqualStrings("jack", sentence_object[0]);
try std.testing.expectEqualStrings("bedroom", sentence_object[1]);
try std.testing.expectEqualStrings("light", sentence_object[2]);
}