package actions

import (
	"testing"
	"time"

	"github.com/stretchr/testify/require"
)

type neverFinishesAsyncAction struct{}

func (neverFinishesAsyncAction) Name() string                         { return "never-finishes" }
func (neverFinishesAsyncAction) Start(ActionArgs) error               { return nil }
func (neverFinishesAsyncAction) CheckFinish(ActionArgs) (bool, error) { return false, nil }

func TestAsyncWrapActionReturnsTypedTimeout(t *testing.T) {
	action := CreateActionFromAsync(neverFinishesAsyncAction{}, time.Millisecond, time.Millisecond)
	err := action.Invoke(ActionArgs{})
	require.Error(t, err)
	require.True(t, IsAsyncTimeoutError(err))
	require.False(t, IsTerminalError(err))
}

func TestAsyncWrapActionCloneAndAbortCapabilities(t *testing.T) {
	action := CreateActionFromAsync(neverFinishesAsyncAction{}, time.Millisecond, time.Second)
	clone := action.(interface{ CloneAction() Action }).CloneAction()
	require.NotSame(t, action, clone)
	require.True(t, TryAbortAction(action))
	require.False(t, TryAbortAction(neverAbortableAction{}))
}

type neverAbortableAction struct{}

func (neverAbortableAction) Name() string            { return "never-abortable" }
func (neverAbortableAction) Invoke(ActionArgs) error { return nil }
