nix-community.nixvim/modules/top-level/test.nix

120 lines
3.2 KiB
Nix
Raw Normal View History

{
pkgs,
config,
options,
lib,
...
}:
let
cfg = config.test;
inherit (config) warnings;
assertions = builtins.concatMap (x: lib.optional (!x.assertion) x.message) config.assertions;
in
{
options.test = {
name = lib.mkOption {
type = lib.types.str;
default = "nixvim-check";
description = "The test derivation's name.";
};
buildNixvim = lib.mkOption {
type = lib.types.bool;
description = "Whether to build the nixvim config in the test.";
default = true;
};
runNvim = lib.mkOption {
type = lib.types.bool;
description = "Whether to run `nvim` in the test.";
defaultText = lib.literalExpression "config.test.buildNixvim";
default = cfg.buildNixvim;
};
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;
};
};
options.build = {
test = lib.mkOption {
type = lib.types.package;
description = ''
A derivation that tests the config by running neovim.
'';
readOnly = true;
};
};
2024-08-24 20:03:04 +01:00
config =
let
showErr =
name: lines:
lib.optionalString (lines != [ ]) ''
Unexpected ${name}:
${lib.concatStringsSep "\n" (lib.map (v: "- ${v}") lines)}
'';
2024-08-24 20:03:04 +01:00
toCheck =
lib.optionalAttrs cfg.checkWarnings { inherit warnings; }
// lib.optionalAttrs cfg.checkAssertions { inherit assertions; };
2024-08-24 20:03:04 +01:00
errors = lib.foldlAttrs (
err: name: lines:
err + showErr name lines
) "" toCheck;
in
{
build.test =
assert lib.assertMsg (cfg.runNvim -> cfg.buildNixvim) "`test.runNvim` requires `test.buildNixvim`.";
pkgs.runCommandNoCCLocal cfg.name
{
nativeBuildInputs = lib.optionals cfg.buildNixvim [
config.build.packageUnchecked
];
# Allow inspecting the test's module a little from the repl
# e.g.
# :lf .
# :p checks.x86_64-linux.test-1.passthru.entries.modules-autocmd.passthru.entries.example.passthru.config.extraConfigLua
#
# Yes, three levels of passthru is cursed.
passthru = {
inherit config options;
};
}
2024-08-24 20:03:04 +01:00
(
# First check warnings/assertions, then run nvim
lib.optionalString (errors != "") ''
echo -n ${lib.escapeShellArg errors}
exit 1
''
# 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
2024-08-24 20:03:04 +01:00
output=$(HOME=$(realpath .) nvim -mn --headless "+q" 2>&1 >/dev/null)
if [[ -n $output ]]; then
echo "ERROR: $output"
exit 1
fi
''
+ ''
touch $out
''
);
};
}