manwhere/tests/unittest/test_parser.zig

196 lines
7 KiB
Zig

const std = @import("std");
const parser = @import("../../src/parser.zig");
const types = @import("../../src/types.zig");
test "parseArgs - basic keyword" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "sleep"};
const config = try parser.parseArgs(allocator, args);
try std.testing.expectEqualStrings("sleep", config.keyword);
try std.testing.expect(config.target_sections == null);
try std.testing.expect(!config.show_paths);
try std.testing.expect(!config.verbose);
}
test "parseArgs - with verbose flag" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "-v", "ls"};
const config = try parser.parseArgs(allocator, args);
try std.testing.expectEqualStrings("ls", config.keyword);
try std.testing.expect(config.verbose);
}
test "parseArgs - with long verbose flag" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "--verbose", "ls"};
const config = try parser.parseArgs(allocator, args);
try std.testing.expectEqualStrings("ls", config.keyword);
try std.testing.expect(config.verbose);
}
test "parseArgs - with paths flag" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "--paths", "printf"};
const config = try parser.parseArgs(allocator, args);
try std.testing.expectEqualStrings("printf", config.keyword);
try std.testing.expect(config.show_paths);
}
test "parseArgs - with section flag short" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "-s", "1", "ls"};
const config = try parser.parseArgs(allocator, args);
try std.testing.expectEqualStrings("ls", config.keyword);
try std.testing.expect(config.target_sections != null);
try std.testing.expectEqual(@as(usize, 1), config.target_sections.?.len);
try std.testing.expectEqualStrings("1", config.target_sections.?[0]);
}
test "parseArgs - with section flag long" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "--section", "3", "printf"};
const config = try parser.parseArgs(allocator, args);
try std.testing.expectEqualStrings("printf", config.keyword);
try std.testing.expect(config.target_sections != null);
try std.testing.expectEqualStrings("3", config.target_sections.?[0]);
}
test "parseArgs - with multiple sections" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "-s", "1", "-s", "3", "test"};
const config = try parser.parseArgs(allocator, args);
try std.testing.expectEqualStrings("test", config.keyword);
try std.testing.expect(config.target_sections != null);
try std.testing.expectEqual(@as(usize, 2), config.target_sections.?.len);
try std.testing.expectEqualStrings("1", config.target_sections.?[0]);
try std.testing.expectEqualStrings("3", config.target_sections.?[1]);
}
test "parseArgs - with section and verbose" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "-v", "-s", "3ssl", "ssl"};
const config = try parser.parseArgs(allocator, args);
try std.testing.expectEqualStrings("ssl", config.keyword);
try std.testing.expect(config.verbose);
try std.testing.expectEqualStrings("3ssl", config.target_sections.?[0]);
}
test "parseArgs - error no keyword" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere"};
const result = parser.parseArgs(allocator, args);
try std.testing.expectError(error.NoKeyword, result);
}
test "parseArgs - error invalid option" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "--invalid", "ls"};
const result = parser.parseArgs(allocator, args);
try std.testing.expectError(error.InvalidOption, result);
}
test "parseArgs - error section without value" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "-s"};
const result = parser.parseArgs(allocator, args);
try std.testing.expectError(error.InvalidOption, result);
}
test "parseArgs - error invalid section letter" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "-s", "abc", "ls"};
const result = parser.parseArgs(allocator, args);
try std.testing.expectError(error.InvalidSection, result);
}
test "parseArgs - error section zero" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "-s", "0", "ls"};
const result = parser.parseArgs(allocator, args);
try std.testing.expectError(error.InvalidSection, result);
}
test "parseArgs - error multiple keywords" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "ls", "cat"};
const result = parser.parseArgs(allocator, args);
try std.testing.expectError(error.MultipleKeywords, result);
}
test "parseArgs - complex combination" {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const args = &[_][:0]u8{"manwhere", "-v", "--paths", "-s", "1", "-s", "8", "admin"};
const config = try parser.parseArgs(allocator, args);
try std.testing.expectEqualStrings("admin", config.keyword);
try std.testing.expect(config.verbose);
try std.testing.expect(config.show_paths);
try std.testing.expectEqual(@as(usize, 2), config.target_sections.?.len);
}
test "HELP_TEXT - contains usage info" {
try std.testing.expect(std.mem.indexOf(u8, parser.HELP_TEXT, "Usage:") != null);
try std.testing.expect(std.mem.indexOf(u8, parser.HELP_TEXT, "OPTIONS:") != null);
try std.testing.expect(std.mem.indexOf(u8, parser.HELP_TEXT, "EXAMPLES:") != null);
try std.testing.expect(std.mem.indexOf(u8, parser.HELP_TEXT, "--verbose") != null);
try std.testing.expect(std.mem.indexOf(u8, parser.HELP_TEXT, "--section") != null);
}