From 9f037eb7549a4c7ac85e3ea4e853be3a6600de48 Mon Sep 17 00:00:00 2001 From: zenith391 <39484230+zenith391@users.noreply.github.com> Date: Tue, 31 Dec 2024 11:05:04 +0100 Subject: [PATCH] test: start adding fuzz testing --- src/backend.zig | 30 ++++++++++++++++++++++++++++++ src/backends/gtk/TextField.zig | 2 +- src/components/TextField.zig | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/backend.zig b/src/backend.zig index 48289cf7..6ffa5fc8 100644 --- a/src/backend.zig +++ b/src/backend.zig @@ -157,6 +157,36 @@ test "backend: text field" { field.setReadOnly(true); field.setReadOnly(false); + + try std.testing.fuzz(fuzzTextField, .{}); +} + +fn fuzzTextField(input: []const u8) !void { + var field = try backend.TextField.create(); + defer field.deinit(); + field.setText(input); + if (std.unicode.utf8ValidateSlice(input)) { + // This constraint only holds if the input is valid UTF-8 + try std.testing.expectEqualStrings(input, field.getText()); + } +} + +test "backend: button" { + try std.testing.fuzz(fuzzButton, .{}); +} + +fn fuzzButton(input: []const u8) !void { + var button = try backend.Button.create(); + defer button.deinit(); + + const null_terminated_input = try std.testing.allocator.dupeZ(u8, input); + defer std.testing.allocator.free(null_terminated_input); + + button.setLabel(null_terminated_input); + if (std.unicode.utf8ValidateSlice(input)) { + // This constraint only holds if the input is valid UTF-8 + try std.testing.expectEqualStrings(null_terminated_input, button.getLabel()); + } } test "backend: scrollable" { diff --git a/src/backends/gtk/TextField.zig b/src/backends/gtk/TextField.zig index 2307fc4e..3b9d4c0c 100644 --- a/src/backends/gtk/TextField.zig +++ b/src/backends/gtk/TextField.zig @@ -27,7 +27,7 @@ pub fn create() common.BackendError!TextField { } pub fn setText(self: *TextField, text: []const u8) void { - var view = std.unicode.Utf8View.initUnchecked(text); + var view = std.unicode.Utf8View.init(text) catch return; var iterator = view.iterator(); var numChars: c_int = 0; while (iterator.nextCodepoint() != null) { diff --git a/src/components/TextField.zig b/src/components/TextField.zig index 6cb9dae7..d8c8a5a9 100644 --- a/src/components/TextField.zig +++ b/src/components/TextField.zig @@ -11,7 +11,7 @@ pub const TextField = struct { peer: ?backend.TextField = null, widget_data: TextField.WidgetData = .{}, - /// The text this TextField contains + /// The text displayed by this TextField. This is assumed to be valid UTF-8. text: Atom([]const u8) = Atom([]const u8).of(""), /// Whether the TextField is read-only readOnly: Atom(bool) = Atom(bool).of(false),