package actions

import (
	"errors"
	"fmt"
	"testing"
)

func TestTerminalError(t *testing.T) {
	inner := fmt.Errorf("kernel task failed")
	err := NewTerminalError(inner)

	if !IsTerminalError(err) {
		t.Fatal("NewTerminalError result should be terminal")
	}
	if !errors.Is(err, inner) {
		t.Fatal("TerminalError should unwrap to the inner error")
	}

	wrapped := fmt.Errorf("action failed: %w", err)
	if !IsTerminalError(wrapped) {
		t.Fatal("terminal error should survive fmt.Errorf %%w wrapping")
	}

	if IsTerminalError(inner) {
		t.Fatal("plain error should not be terminal")
	}
	if IsTerminalError(nil) {
		t.Fatal("nil should not be terminal")
	}
	if NewTerminalError(nil) != nil {
		t.Fatal("NewTerminalError(nil) should be nil")
	}

	// a directly-constructed TerminalError with nil Err must not panic
	nilInner := &TerminalError{}
	if nilInner.Error() != "terminal" {
		t.Fatalf("nil-inner TerminalError.Error() should be safe, got %q", nilInner.Error())
	}
	if !IsTerminalError(nilInner) {
		t.Fatal("nil-inner TerminalError should still be terminal")
	}
}
