2.6 KiB
gs_test
Framework for test implementation + test discovery in jai
Description
This Jai Module provies a means of writing tests and building a test executable that can be used in applications such as CI runners.
How It Works
- You call
gs_test.build_all_tests
from your build script - gs_test scans your project directory for files ending in the specified extension (default is
.test.jai
) - For each test file found, gs_test outputs an executable
- gs_test outputs a
run_all_tests
file
You can call run_all_tests
in CI and it will output an error code if any tests fail.
To Try It Out:
- Put gs_test somewhere where your jai compiler can find it.
ie.
C:\jai\modules\gs_test
- Copy the two examples below into files in the same directory
- Run
jai -import_dir C:\jai\modules build.jai
- Run
./tests/run_all_tests.sh
(you might need to give it execute permissions first)
Example Usage:
build.jai
#import "Compiler";
gs_test :: #import "gs_test";
#run build();
build :: ()
{
w := compiler_create_workspace("Target Program");
target_options := get_build_options(w);
mc := gs_test.Config.{
// See gs_test/module.jai::Config for information on how to configure things further
root_path = #filepath
}
gs_test.build_all_tests(mc, target_options);
set_build_options_dc(.{ do_output = false });
}
main.test.jai
main :: () {
Init_Test_Harness();
Test("my test", () {
expect(5, 5); // succeeds
expect(5, 3); // fails
});
Run_Test_Harness();
}
Why One Executable Per Test File?
Because of the way Jai handles imports, we have to either have a single test executable which runs all your tests, or make an executable per test file. In the former case, we'd be forced to do a bunch of complicated things to deduplicate #load calls in the cases where you have separate tests importing the same files. This solution seemed simpler - you define your tests how you want, and for each file, just import what that test requires. I may revist this in the future.
Goals
- Simply import the test framework into your build pipeline, pass compiler messages to it, and get tests out.
- Easily write tests, and get useful failure information back out.
- Reasonable Defaults:
- creates a single test executable next to your output
- runs all tests, returning failure codes on exit
- tests can be placed in *.test.jai files or inline with @test tags.
- Customization
- name the output file
- define the pattern for test files (ie. instead of *.test.jai, use something else)
- define the test tag (ie. instead of @test, use something else)