From 7908729711351b596160ddcdc138bb925d846f87 Mon Sep 17 00:00:00 2001 From: traxys Date: Sat, 20 Jul 2024 00:18:36 +0200 Subject: [PATCH] dev: Make the tests command able to select which test to launch The `tests` command can either launch all tests (without any arguments), a specific test with `-t/--test` or choose a test with `-i/--interactive` --- flake-modules/dev/default.nix | 1 + flake-modules/dev/devshell.nix | 18 +++++-- flake-modules/dev/launch-test.sh | 83 ++++++++++++++++++++++++++++++++ tests/default.nix | 2 +- 4 files changed, 99 insertions(+), 5 deletions(-) create mode 100755 flake-modules/dev/launch-test.sh diff --git a/flake-modules/dev/default.nix b/flake-modules/dev/default.nix index b5a6c245..617dd5cf 100644 --- a/flake-modules/dev/default.nix +++ b/flake-modules/dev/default.nix @@ -34,6 +34,7 @@ }; statix.enable = true; stylua.enable = true; + shfmt.enable = true; taplo.enable = true; }; diff --git a/flake-modules/dev/devshell.nix b/flake-modules/dev/devshell.nix index d1ef469c..7eb39caf 100644 --- a/flake-modules/dev/devshell.nix +++ b/flake-modules/dev/devshell.nix @@ -32,11 +32,21 @@ { name = "tests"; help = "Run nixvim tests"; - command = '' - echo "=> Running nixvim tests for the '${system}' architecture..." + command = + let + launchTest = pkgs.writeShellApplication { + name = "launch-tests"; + runtimeInputs = with pkgs; [ + jq + fzf + ]; - ${nix} build .#checks.${system}.tests "$@" - ''; + text = builtins.readFile ./launch-test.sh; + }; + in + '' + NIXVIM_SYSTEM=${system} NIXVIM_NIX_COMMAND=${nix} ${lib.getExe launchTest} "$@" + ''; } { name = "test-lib"; diff --git a/flake-modules/dev/launch-test.sh b/flake-modules/dev/launch-test.sh new file mode 100755 index 00000000..7cf19470 --- /dev/null +++ b/flake-modules/dev/launch-test.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash + +: "${NIXVIM_NIX_COMMAND:=nix}" +if [[ -z ${NIXVIM_SYSTEM+x} ]]; then + NIXVIM_SYSTEM=$(nix eval --raw --impure --expr "builtins.currentSystem") +fi + +help() { + cat <&2 + help + exit 1 +fi + +eval set -- "$OPTS" + +specified_tests=() +interactive=false + +mk_test_list() { + nix eval ".#checks.${NIXVIM_SYSTEM}" --apply builtins.attrNames --json | + jq -r 'map(select(startswith("test-")))[]' +} + +while true; do + case "$1" in + -h | --help) + help + exit 0 + ;; + -l | --list) + mk_test_list + exit 0 + ;; + -i | --interactive) + interactive=true + shift + ;; + --) + shift + specified_tests=("$@") + break + ;; + esac +done + +run_tests() { + # Add the prefix "checks.${system}." to each argument + if ! "${NIXVIM_NIX_COMMAND}" build --no-link --file . "${@/#/checks.${NIXVIM_SYSTEM}.}"; then + echo "Test failure" >&2 + exit 1 + fi +} + +if [[ $interactive = true && ${#specified_tests[@]} -ne 0 ]]; then + echo "Can't use --interactive with tests on the command line" >&2 + exit 1 +fi + +if [[ $interactive = true ]]; then + test_name=$(mk_test_list | fzf) || exit $? + specified_tests+=("$test_name") +fi + +if [[ ${#specified_tests[@]} -eq 0 ]]; then + readarray -t complete_test_list < <(mk_test_list) + run_tests "${complete_test_list[@]}" +else + echo "Running ${#specified_tests[@]} tests: ${specified_tests[*]}" >&2 + run_tests "${specified_tests[@]}" +fi diff --git a/tests/default.nix b/tests/default.nix index f62849d0..7af51592 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -48,7 +48,7 @@ builtins.listToAttrs ( dontRunModule = case: case.tests.dontRun or false; in { - inherit name; + name = "test-${name}"; value = mkTestDerivationFromNixvimModule { inherit name; tests = builtins.map (