package nixbuild_test import ( "errors" "io" "os" "slices" "strings" "syscall" "testing" "git.gensokyo.uk/yonah/nixbuild" "hakurei.app/command" ) func init() { stubCommandInit = append(stubCommandInit, func(c command.Command) { var ( flagBuildKeepGoing bool flagBuildNoLink bool flagBuildStdin bool flagBuildQuiet bool flagBuildPBL bool flagBuildVerbose bool ) c.NewCommand(nixbuild.CommandBuild, "emit samples for various `nix build` cases", func(args []string) error { switch { default: return os.ErrInvalid case len(args) == 7 && slices.Equal(args[1:], []string{ nixbuild.FlagOption, nixbuild.OptionEvalCache, nixbuild.ValueFalse, nixbuild.FlagDryRun, nixbuild.FlagPrintBuildLogs, nixbuild.FlagDebug, }): // InstantiatedEvaluator return stubInstantiatedEvaluator(args) case flagBuildKeepGoing, flagBuildNoLink, flagBuildStdin: // Build switch { default: return syscall.ENOTRECOVERABLE case flagBuildQuiet && !flagBuildPBL && !flagBuildVerbose: return checkStdin(os.Stdin, "quiet") case !flagBuildQuiet && flagBuildPBL && !flagBuildVerbose: return checkStdin(os.Stdin, "logs") case flagBuildQuiet && !flagBuildPBL && flagBuildVerbose: return checkStdin(os.Stdin, "quiet", "verbose") case !flagBuildQuiet && flagBuildPBL && flagBuildVerbose: return checkStdin(os.Stdin, "logs", "verbose") } } }). Flag(&flagBuildKeepGoing, trimFlagName(nixbuild.FlagKeepGoing), command.BoolFlag(false), nixbuild.FlagKeepGoing). Flag(&flagBuildNoLink, trimFlagName(nixbuild.FlagNoLink), command.BoolFlag(false), nixbuild.FlagNoLink). Flag(&flagBuildStdin, trimFlagName(nixbuild.FlagStdin), command.BoolFlag(false), nixbuild.FlagStdin). Flag(&flagBuildQuiet, trimFlagName(nixbuild.FlagQuiet), command.BoolFlag(false), nixbuild.FlagQuiet). Flag(&flagBuildPBL, trimFlagName(nixbuild.FlagPrintBuildLogs), command.BoolFlag(false), nixbuild.FlagPrintBuildLogs). Flag(&flagBuildVerbose, trimFlagName(nixbuild.FlagVerbose), command.BoolFlag(false), nixbuild.FlagVerbose) }) } func TestBuild(t *testing.T) { stubNixCommand(t) check := func(stdout, stderr io.Writer, v ...string) { t.Run(strings.Join(v, " "), func(t *testing.T) { if err := nixbuild.Build( newStubContext(t.Context(), nil, stdout, stderr), slices.Values(v), ); err != nil { t.Errorf("Build: error = %v", err) } }) } check(nil, nil, "quiet") check(os.Stdout, nil, "logs") check(nil, os.Stderr, "quiet", "verbose") check(os.Stdout, os.Stderr, "logs", "verbose") } func TestBuildBadCommand(t *testing.T) { wantErr := os.ErrNotExist breakNixCommand(t) if err := nixbuild.Build( nixbuild.New(t.Context(), nil, nil, nil), nil, ); !errors.Is(err, wantErr) { t.Errorf("Build: error = %v, want %v", err, wantErr) } }