// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"bytes"
	"flag"
	"io"
	"os"
	"path/filepath"
	"strings"
	"testing"
)

func TestUsageLine(t *testing.T) {
	binName := filepath.Base(os.Args[0])
	tests := []struct {
		name string
		c    *command
		want string
	}{
		{
			name: "no args",
			c:    &command{name: "version"},
			want: binName + " version",
		},
		{
			name: "with args",
			c:    &command{name: "package", args: "<package>[@version]"},
			want: binName + " package [flags] <package>[@version]",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := tt.c.usageLine(); got != tt.want {
				t.Errorf("usageLine() = %q, want %q", got, tt.want)
			}
		})
	}
}

func TestDispatch(t *testing.T) {
	dummyCmd := &command{
		name:    "dummy",
		summary: "dummy command",
		run: func(fs *flag.FlagSet, stdout, stderr io.Writer) int {
			return 0
		},
	}

	flagsCmd := &command{
		name:    "flags",
		summary: "command with flags",
		flags:   flag.NewFlagSet("flags", flag.ContinueOnError),
		run: func(fs *flag.FlagSet, stdout, stderr io.Writer) int {
			return 0
		},
	}

	cmds := []*command{dummyCmd, flagsCmd}

	tests := []struct {
		name       string
		args       []string
		wantExit   int
		wantStdout string
		wantStderr string
	}{
		{
			name:       "no arguments",
			args:       []string{},
			wantExit:   2,
			wantStderr: "Usage:",
		},
		{
			name:       "only flags",
			args:       []string{"-json"},
			wantExit:   2,
			wantStderr: "Usage:",
		},
		{
			name:       "known command",
			args:       []string{"dummy"},
			wantExit:   0,
			wantStdout: "",
		},
		{
			name:       "known command with flags",
			args:       []string{"flags"},
			wantExit:   0,
			wantStdout: "",
		},
		{
			name:       "unknown command",
			args:       []string{"unknown"},
			wantExit:   2,
			wantStderr: "unknown command: unknown",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			var stdout, stderr bytes.Buffer
			exit := dispatch(tt.args, cmds, &stdout, &stderr)
			if exit != tt.wantExit {
				t.Errorf("dispatch() exit = %d, want %d", exit, tt.wantExit)
			}
			if tt.wantStdout != "" && !strings.Contains(stdout.String(), tt.wantStdout) {
				t.Errorf("dispatch() stdout = %q, want to contain %q", stdout.String(), tt.wantStdout)
			}
			if tt.wantStderr != "" && !strings.Contains(stderr.String(), tt.wantStderr) {
				t.Errorf("dispatch() stderr = %q, want to contain %q", stderr.String(), tt.wantStderr)
			}
		})
	}
}

func TestVersionInfo(t *testing.T) {
	v := versionInfo()
	binName := filepath.Base(os.Args[0])
	if !strings.HasPrefix(v, binName) {
		t.Errorf("versionInfo() = %q, want to start with %q", v, binName)
	}
}
