Testing language configurations

Adding support for a language in Mergiraf doesn't require any code, just declarative configuration, but it's still worth checking that the merging that it enables works as expected, and that it keeps doing so in the future.

Directory structure

You can add test cases to the end-to-end suite by following the directory structure of other such test cases. Create a directory of the form:

examples/csharp/working/add_imports

The naming of the csharp directory does not matter, nor does add_imports which describes the test case we are about to write. In this directory go the following files:

Base.cs
Left.cs
Right.cs
Expected.cs

All files should have an extension which matches what you defined in the language profile, for them to be parsed correctly. The Base, Left and Right files contain the contents of a sample file at all three revisions, and Expected contains the expected merge output of the tool (including any conflict markers).

If the language you're adding is specified using the full file name (Makefile/pyproject.toml), the test directory should additionally contain a language file with one of the file_names specified in the language profile.

For example, here's a directory structure of a Makefile test:

Base
Left
Right
Expected
language // contains "Makefile" (without the quotes)

and for pyproject.toml:

Base.toml
Left.toml
Right.toml
Expected.toml
language // contains "pyproject.toml"

Running the tests

To run an individual test, you can use a helper:

$ helpers/inspect.sh examples/csharp/working/add_imports

This will show any differences between the expected output of the merge and the actual one. It also saves the result of some intermediate stages of the merging process in the debug directory, such as the matchings between the three trees as Dotty graphs. Those can be viewed as SVG files by running helpers/generate_svg.sh.

To run a test with a debugger, you can use the test defined in tests/integration_tests.rs:

// use this test to debug a specific test case by changing the path in it.
#[test]
fn debug_test() {
    run_test_from_dir(Path::new("examples/go/working/remove_and_add_imports"))
}

You can then use an IDE (such as Codium with Rust-analyzer) to set up breakpoints to inspect the execution of the test.