add(testing): how to create zon test files and use them for regression testing
60
Testing.md
60
Testing.md
@@ -3,3 +3,63 @@
|
|||||||
Using a different testing renderer (in a corresponding namespace `zterm.testing`) renderes without flushing to the screen, but keeps the corresponding `zterm.Cell` slice for comparison. The main question would rather be how to provide the expected value for the `zterm.Cell` slice.
|
Using a different testing renderer (in a corresponding namespace `zterm.testing`) renderes without flushing to the screen, but keeps the corresponding `zterm.Cell` slice for comparison. The main question would rather be how to provide the expected value for the `zterm.Cell` slice.
|
||||||
|
|
||||||
The test renderer shall be configured with a given size (as the corresponding terminal for the screen size will not be available). This serves two aspects: Firstly, `.resize` Event triggering and secondly, the rendering into a `zterm.Cell` slice with the provided size dimensions (for testing layout handling and rendering (i.e. of a scrollable element, etc.)).
|
The test renderer shall be configured with a given size (as the corresponding terminal for the screen size will not be available). This serves two aspects: Firstly, `.resize` Event triggering and secondly, the rendering into a `zterm.Cell` slice with the provided size dimensions (for testing layout handling and rendering (i.e. of a scrollable element, etc.)).
|
||||||
|
|
||||||
|
For testing `Container`s and/or `Element`s content generation the correspondingly rendered `Cell` slices are tested. For this the test creation is two steped. The first step is the creation of the `.zon` file which contains the expected `Cell` slice for the screen you want to test (you can also test multiple screens - which would be necessary when testing for interactivity). Secondly you create the test case now against the created `.zon` file.
|
||||||
|
|
||||||
|
## Zon Test file creation
|
||||||
|
|
||||||
|
```zig
|
||||||
|
test "create container zon file" {
|
||||||
|
const event = @import("event.zig");
|
||||||
|
const testing = @import("testing.zig");
|
||||||
|
|
||||||
|
var container: Container(event.SystemEvent) = try .init(std.testing.allocator, .{
|
||||||
|
.border = .{
|
||||||
|
.color = .green,
|
||||||
|
.sides = .horizontal,
|
||||||
|
},
|
||||||
|
}, .{});
|
||||||
|
defer container.deinit();
|
||||||
|
|
||||||
|
const size: Size = .{
|
||||||
|
.rows = 20,
|
||||||
|
.cols = 30,
|
||||||
|
};
|
||||||
|
|
||||||
|
// NOTE: this is dependent on the working directory the test will be executed in
|
||||||
|
const file = try std.fs.cwd().createFile("src/test/<path>.zon", .{ .truncate = true });
|
||||||
|
defer file.close();
|
||||||
|
|
||||||
|
const allocator = std.testing.allocator;
|
||||||
|
var renderer: testing.Renderer = .init(allocator, size);
|
||||||
|
defer renderer.deinit();
|
||||||
|
|
||||||
|
try container.handle(.{ .resize = size });
|
||||||
|
try renderer.render(Container(event.SystemEvent), &container);
|
||||||
|
try renderer.save(file.writer());
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
After running the test as usual you created the `<path>.zon` file accordingly in the specified directory. Afterwards you can create the test against that file and the test above should be replaced with the test below.
|
||||||
|
|
||||||
|
## Test against zon file
|
||||||
|
|
||||||
|
```zig
|
||||||
|
test "test container against zon file" {
|
||||||
|
const event = @import("event.zig");
|
||||||
|
const testing = @import("testing.zig");
|
||||||
|
|
||||||
|
var container: Container(event.SystemEvent) = try .init(std.testing.allocator, .{
|
||||||
|
.border = .{
|
||||||
|
.color = .green,
|
||||||
|
.sides = .horizontal,
|
||||||
|
},
|
||||||
|
}, .{});
|
||||||
|
defer container.deinit();
|
||||||
|
|
||||||
|
try testing.expectContainerScreen(.{
|
||||||
|
.rows = 20,
|
||||||
|
.cols = 30,
|
||||||
|
}, &container, @import("test/<path>.zon"));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user