{ config, lib, pkgs, ... }:

with lib;

{
  options.test.asserts = {
    warnings = {
      enable = mkOption {
        type = types.bool;
        default = true;
        description = "Whether warning asserts are enabled.";
      };

      expected = mkOption {
        type = types.listOf types.str;
        default = [ ];
        description = ''
          List of expected warnings.
        '';
      };
    };

    assertions = {
      enable = mkOption {
        type = types.bool;
        default = true;
        description = "Whether assertion asserts are enabled.";
      };

      expected = mkOption {
        type = types.listOf types.str;
        default = [ ];
        description = ''
          List of expected assertions.
        '';
      };
    };
  };

  config = mkMerge [
    (mkIf config.test.asserts.warnings.enable {
      home.file = {
        "asserts/warnings.actual".text = concatStringsSep ''

          --
        '' config.warnings;
      };

      nmt.script = ''
        assertFileContent \
          home-files/asserts/warnings.actual \
          ${
            pkgs.writeText "warnings.expected" (concatStringsSep ''

              --
            '' config.test.asserts.warnings.expected)
          }
      '';
    })

    (mkIf config.test.asserts.assertions.enable {
      home.file = {
        "asserts/assertions.actual".text = concatStringsSep ''

          --
        '' (map (x: x.message) (filter (x: !x.assertion) config.assertions));
      };

      nmt.script = ''
        assertFileContent \
          home-files/asserts/assertions.actual \
          ${
            pkgs.writeText "assertions.expected" (concatStringsSep ''

              --
            '' config.test.asserts.assertions.expected)
          }
      '';
    })
  ];
}