// Copyright 2019 The Fuchsia 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 command_test

import (
	"context"
	"flag"
	"testing"
	"time"

	"github.com/google/subcommands"
	"go.fuchsia.dev/tools/command"
)

func TestCancelableExecute(t *testing.T) {
	tests := []struct {
		// The name of this test case
		name string

		// Whether to cancel the execution context early.
		cancelContextEarly bool

		// Whether the underlying subcommand is expected to finish
		expectToFinish bool
	}{
		{"when context is canceled early", true, false},
		{"when context is never canceled", false, true},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			tcmd := &TestCommand{}
			cmd := command.Cancelable(tcmd)
			ctx, cancel := context.WithCancel(context.Background())
			if tt.cancelContextEarly {
				cancel()
				cmd.Execute(ctx, flag.NewFlagSet("test", flag.ContinueOnError))
			} else {
				cmd.Execute(ctx, flag.NewFlagSet("test", flag.ContinueOnError))
				cancel()
			}

			if tcmd.DidFinish && !tt.expectToFinish {
				t.Errorf("wanted command to exit early but it finished")
			} else if !tcmd.DidFinish && tt.expectToFinish {
				t.Errorf("wanted command to finish but it exited early")
			}
		})
	}
}

// TestCancelableDelegation verifies that Cancelable() returns a subcommand.Command that
// delegates to the input subcommand.Command.
func TestCancelableDelegation(t *testing.T) {
	expectEq := func(t *testing.T, name, expected, actual string) {
		if expected != actual {
			t.Errorf("wanted %s to be %q but got %q", name, expected, actual)
		}
	}
	cmd := command.Cancelable(&TestCommand{
		name:     "test_name",
		usage:    "test_usage",
		synopsis: "test_synopsis",
	})
	expectEq(t, "Name", "test_name", cmd.Name())
	expectEq(t, "Usage", "test_usage", cmd.Usage())
	expectEq(t, "Synopsis", "test_synopsis", cmd.Synopsis())
}

type TestCommand struct {
	name, usage, synopsis string
	DidFinish             bool
}

func (cmd *TestCommand) Name() string             { return cmd.name }
func (cmd *TestCommand) Usage() string            { return cmd.usage }
func (cmd *TestCommand) Synopsis() string         { return cmd.synopsis }
func (cmd *TestCommand) SetFlags(f *flag.FlagSet) {}
func (cmd *TestCommand) Execute(ctx context.Context, f *flag.FlagSet, args ...interface{}) subcommands.ExitStatus {
	time.Sleep(time.Millisecond)
	cmd.DidFinish = true
	return subcommands.ExitSuccess
}
