let inherit (import ../default.nix { }) pkgs; inherit (pkgs) lib; inherit (builtins) tryEval; inherit (lib) mkOption types; inherit (types) int str submodule ; functionType = submodule ./function.nix; in { _class = "nix-unit"; test-function-ok = { expr = tryEval (lib.evalModules { modules = [ ( { config, ... }: { options = { fn = mkOption { type = functionType; }; call = mkOption { default = config.fn.apply 1; }; }; config.fn = { implementation = x: x; input-type = int; output-type = int; }; } ) ]; }).config.call; expected = { success = true; value = 1; }; }; test-bad-input = { expr = tryEval (lib.evalModules { modules = [ ( { config, ... }: { options = { fn = mkOption { type = functionType; }; call = mkOption { default = config.fn.apply 1; }; }; config.fn = { implementation = x: x; input-type = str; output-type = int; }; } ) ]; }).config.call; expected = { success = false; value = false; }; }; test-bad-output = { expr = tryEval (lib.evalModules { modules = [ ( { config, ... }: { options = { fn = mkOption { type = functionType; }; call = mkOption { default = config.fn.apply 1; }; }; config.fn = { implementation = x: x; input-type = int; output-type = str; }; } ) ]; }).config.call; expected = { success = false; value = false; }; }; test-read-only = { expr = tryEval (lib.evalModules { modules = [ ( { config, ... }: { options = { fn = mkOption { type = functionType; }; call = mkOption { default = config.fn.apply { }; }; }; config.fn = let sub = submodule { options.foo = mkOption { type = int; readOnly = true; default = 1; }; }; in { implementation = x: x; input-type = sub; output-type = sub; type-output = false; }; } ) ]; }).config.call; expected = { success = true; value = { foo = 1; }; }; }; }