A minimal testing module for kdb+/q. Provides assertion primitives and a test runner, packaged as a kdb-x module.
Place the cutie directory on your module search path ($QHOME/mod by default).
Load the module and bind it to a name:
qt: use`cutieDefine test functions — any function named test_* in the root namespace is automatically discovered:
test_add:{ qt.eq[1+1; 2; "integer addition"] };
test_sqrt:{ qt.near[sqrt 2; 1.41421356; 1e-7; "sqrt 2"] };Run all tests:
qt.run[]Example output:
[PASS] test_add
[PASS] test_sqrt
2 tests, 2 passed, 0 failed
On failure:
[PASS] test_add
[FAIL] test_sqrt
2 tests, 1 passed, 1 failed
FAILURES:
─────────
test_sqrt:
NEAR: sqrt 2
expected: 1.41421356 +/-1e-07
actual: 1.414213562373095
You can also run a specific subset of tests by passing a list of symbols:
qt.run`test_add`test_sqrtAsserts a ~ e (structural equality). Fails if they differ in value or type.
qt.eq[1+1; 2; "basic addition"]
qt.eq[`foo; `foo; "symbol identity"]
qt.eq[(1;`a;"x"); (1;`a;"x"); "mixed list"]
/ Note: int and float are NOT structurally equal
qt.neq[1; 1f; "int vs float"]Asserts a and e are not structurally equal.
qt.neq[`a; `b; "distinct symbols"]Asserts condition c is 1b.
qt.true[3>2; "3 is greater than 2"]
qt.true[`b in `a`b`c; "symbol membership"]Asserts condition c is 0b.
qt.false[1>2; "1 is not greater than 2"]Asserts abs[a-e] < t. Use this instead of eq when comparing floats.
qt.near[sqrt 2; 1.41421356; 1e-7; "sqrt 2"]
qt.near[1%3; 0.3333333; 1e-6; "reciprocal"]Like near, but for float vectors — asserts all t > abs a-e.
a: 1 2 3f;
qt.allnear[a%max a; 0.333333 0.666667 1f; 1e-5; "normalised vector"]Runs tests and prints results. Pass () or call as qt.run[] to auto-discover all test_* functions in the root namespace. Pass a symbol list to run specific tests.
Returns the count of failures (0 on full pass).
Returns a list of all test_* symbols found in the root namespace. Useful for inspecting what would be run before calling qt.run[].
See example.q for a runnable file that exercises every primitive.