Testing

This section describes how to run Zink’s tests and add new tests.

Before continuing, make sure you can build Zink successfully. Can’t run the tests if you can’t build it!

Running All Tests

cargo test --all

Adding New Tests for the Compiler

At the current stage, we are lack of the tests of the compiler, the tests of it are gathered in compiler/tests.

Each file under compiler/tests are named by instruction, for example add.rs, it includes the tests related to instruction ADD.

For adding a new test for compiler/tests/add.rs, we need to write a wasm program for it first, for example, the wasm program of the params test of ADD is located at compiler/wat/i32add/params.wat.

(module
    (func (param i32) (param i32) (result i32)
    (local.get 0)
    (local.get 1)
    (i32.add)
    )
)

In compiler/tests/add.rs:

#[test]
fn params() -> Result<()> {
    let bytecode = common::load("i32add", "params")?;

    // add(1, 2)
    let input = [1.to_bytes32(), 2.to_bytes32()].concat();
    let info = EVM::run(&bytecode, &input);

    assert_eq!(info.ret, [3.to_bytes32()].concat());
    Ok(())
}

We use common::load("i32add", "params") to load wat file to EVM bytecode from compiler/tests/wat/i32add/params.wat, execute with the EVM provided by zint, compare if the result is as expected, that’s it!