Skip to content

Commit

Permalink
modules/test: check warnings/assertions
Browse files Browse the repository at this point in the history
Warnings and assertions defined as `config.warnings` and `config.assertions`
respectively will be checked as part of the test derivation, instead of
when evaluating the modules.

Adds new `checkWarnings` and `checkAssertions` test options (default true).
  • Loading branch information
MattSturgeon committed Aug 22, 2024
1 parent 83c2844 commit 088e584
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 11 deletions.
3 changes: 3 additions & 0 deletions lib/tests.nix
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ let
extraSpecialArgs = {
defaultPkgs = pkgs;
} // extraSpecialArgs;
# Don't check assertions/warnings while evaluating nixvim config
# We'll let the test derivation handle that
check = false;
};
in
result.config.test.derivation;
Expand Down
60 changes: 49 additions & 11 deletions modules/top-level/test.nix
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
}:
let
cfg = config.test;

inherit (config) warnings;
assertions = lib.nixvim.modules.getAssertionMessages config.assertions;
in
{
options.test = {
Expand All @@ -21,6 +24,18 @@ in
default = true;
};

checkWarnings = lib.mkOption {
type = lib.types.bool;
description = "Whether to check `config.warnings` in the test.";
default = true;
};

checkAssertions = lib.mkOption {
type = lib.types.bool;
description = "Whether to check `config.assertions` in the test.";
default = true;
};

# Output
derivation = lib.mkOption {
type = lib.types.package;
Expand All @@ -38,19 +53,42 @@ in

nativeBuildInputs = [ config.finalPackage ];

# We need to set HOME because neovim will try to create some files
#
# Because neovim does not return an exitcode when quitting we need to check if there are
# errors on stderr
buildPhase = lib.optionalString cfg.runNvim ''
mkdir -p .cache/nvim
# First check warnings/assertions, then run nvim
buildPhase =
let
showErr =
name: lines:
lib.optionalString (lines != [ ]) ''
Unexpected ${name}:
${lib.concatStringsSep "\n" (lib.map (v: "- ${v}") lines)}
'';

output=$(HOME=$(realpath .) nvim -mn --headless "+q" 2>&1 >/dev/null)
if [[ -n $output ]]; then
echo "ERROR: $output"
toCheck =
lib.optionalAttrs cfg.checkWarnings { inherit warnings; }
// lib.optionalAttrs cfg.checkAssertions { inherit assertions; };

errors = lib.foldlAttrs (
err: name: lines:
err + showErr name lines
) "" toCheck;
in
lib.optionalString (errors != "") ''
echo -n ${lib.escapeShellArg errors}
exit 1
fi
'';
''
# We need to set HOME because neovim will try to create some files
#
# Because neovim does not return an exitcode when quitting we need to check if there are
# errors on stderr
+ lib.optionalString cfg.runNvim ''
mkdir -p .cache/nvim
output=$(HOME=$(realpath .) nvim -mn --headless "+q" 2>&1 >/dev/null)
if [[ -n $output ]]; then
echo "ERROR: $output"
exit 1
fi
'';

# If we don't do this nix is not happy
installPhase = ''
Expand Down

0 comments on commit 088e584

Please sign in to comment.