From a1e9cae5d22800a16c0979ed5967b0f98df4a870 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Sun, 3 Apr 2022 12:44:22 +0300 Subject: [PATCH] tests: add a vlib/v/tests/known_errors/known_errors_test.v test runner --- TESTS.md | 14 ++++++++ vlib/v/tests/known_errors/known_errors_test.v | 36 +++++++++++++++++++ .../dereference_mut_interface_in_loop.vv | 18 ++++++++++ 3 files changed, 68 insertions(+) create mode 100644 vlib/v/tests/known_errors/known_errors_test.v create mode 100644 vlib/v/tests/known_errors/testdata/dereference_mut_interface_in_loop.vv diff --git a/TESTS.md b/TESTS.md index f89d3e35c..eb5d3e01d 100644 --- a/TESTS.md +++ b/TESTS.md @@ -83,6 +83,20 @@ This *test runner*, checks whether whole project folders, can be compiled, and r NB: Each project in these folders, should finish with an exit code of 0, and it should output `OK` as its last stdout line. +## `v vlib/v/tests/known_errors/known_errors_test.v` +This *test runner*, checks whether a known program, that was expected to compile, +but did NOT, due to a buggy checker, parser or cgen, continues to fail. +The negative programs are collected in the `vlib/v/tests/known_errors/testdata/` folder. +Each of them should FAIL to compile, due to a known/confirmed compiler bug/limitation. + +The intended use of this, is for providing samples, that currently do NOT compile, +but that a future compiler improvement WILL be able to compile, and to +track, whether they were not fixed incidentally, due to an unrelated +change/improvement. For example, code that triggers generating invalid C code can go here, +and later when a bug is fixed, can be moved to a proper _test.v or .vv/.out pair, outside of +the `vlib/v/tests/known_errors/testdata/` folder. + + ## Test building of actual V programs (examples, tools, V itself) * `v build-tools` diff --git a/vlib/v/tests/known_errors/known_errors_test.v b/vlib/v/tests/known_errors/known_errors_test.v new file mode 100644 index 000000000..5fa69c2c0 --- /dev/null +++ b/vlib/v/tests/known_errors/known_errors_test.v @@ -0,0 +1,36 @@ +import os + +const vexe = @VEXE + +const vroot = os.dir(vexe) + +const testdata_folder = 'vlib/v/tests/known_errors/testdata' + +fn test_known_errors_testdata_folder_exists() ? { + os.chdir(vroot) ? + assert os.is_dir(testdata_folder) +} + +fn test_known_failures_are_still_failures() ? { + mut oks := []string{} + mut files := os.walk_ext(testdata_folder, '.v') + files << os.walk_ext(testdata_folder, '.vv') + for f in files { + cmd := '${os.quoted_path(vexe)} ${os.quoted_path(f)}' + println('known compilation failure: $cmd') + res := os.execute(cmd) + if res.exit_code == 0 { + oks << cmd + println(' unexpectedly COMPILED: $cmd') + } else { + assert true + } + } + println('Summary: $files.len files, $oks.len unexpectedly succeeded.') + if oks.len != 0 { + for cmd in oks { + println(' expected to fail, but SUCCEEDED command: $cmd') + } + assert false + } +} diff --git a/vlib/v/tests/known_errors/testdata/dereference_mut_interface_in_loop.vv b/vlib/v/tests/known_errors/testdata/dereference_mut_interface_in_loop.vv new file mode 100644 index 000000000..223181211 --- /dev/null +++ b/vlib/v/tests/known_errors/testdata/dereference_mut_interface_in_loop.vv @@ -0,0 +1,18 @@ +module main + +import rand +import rand.wyrand +import rand.splitmix64 + +fn main() { + mut wyrand_rng := &rand.PRNG(&wyrand.WyRandRNG{}) + mut splitmix_rng := &rand.PRNG(&splitmix64.SplitMix64RNG{}) + + mut generators := [wyrand_rng, splitmix_rng] + for mut rng in generators { + seed_len := rng.block_size() / 32 + // NB: `seed_len := (*rng).block_size() / 32` does compile + dump(seed_len) + println(rng.string(15)) + } +} -- 2.30.2