Files
tutti/packages/agent/host/edit_retry_contract_test.go
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

128 lines
4.5 KiB
Go

package agenthost
import (
"errors"
"testing"
)
func TestRuntimeDispatchDispositionContractValues(t *testing.T) {
tests := []struct {
name string
got RuntimeDispatchDisposition
want string
}{
{name: "applied", got: RuntimeDispatchDispositionApplied, want: "applied"},
{name: "applied without provider turn", got: RuntimeDispatchDispositionAppliedWithoutProviderTurn, want: "applied_without_provider_turn"},
{name: "rejected", got: RuntimeDispatchDispositionRejected, want: "rejected"},
{name: "not dispatched", got: RuntimeDispatchDispositionNotDispatched, want: "not_dispatched"},
{name: "outcome unknown", got: RuntimeDispatchDispositionOutcomeUnknown, want: "outcome_unknown"},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
if got := string(test.got); got != test.want {
t.Fatalf("RuntimeDispatchDisposition = %q, want %q", got, test.want)
}
})
}
}
func TestRuntimeAcceptanceSourceContractValues(t *testing.T) {
tests := []struct {
name string
got RuntimeAcceptanceSource
want string
}{
{name: "turn start response", got: RuntimeAcceptanceSourceTurnStartResponse, want: "turn_start_response"},
{name: "history read", got: RuntimeAcceptanceSourceHistoryRead, want: "history_read"},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
if got := string(test.got); got != test.want {
t.Fatalf("RuntimeAcceptanceSource = %q, want %q", got, test.want)
}
})
}
}
func TestEditRetryContractValues(t *testing.T) {
actions := map[EditRetryRecoveryAction]string{
EditRetryRecoveryActionReconcile: "reconcile",
EditRetryRecoveryActionRetryReplacement: "retry_replacement",
}
for got, want := range actions {
if string(got) != want {
t.Fatalf("EditRetryRecoveryAction = %q, want %q", got, want)
}
}
states := map[EditRetryState]string{
EditRetryStatePrepared: "prepared",
EditRetryStateRollingBack: "rolling_back",
EditRetryStateResendPending: "resend_pending",
EditRetryStateRecoveryRequired: "recovery_required",
EditRetryStateCompleted: "completed",
}
for got, want := range states {
if string(got) != want {
t.Fatalf("EditRetryState = %q, want %q", got, want)
}
}
reasons := map[EditRetryReasonCode]string{
EditRetryReasonCodeProviderUnsupported: "provider_unsupported",
EditRetryReasonCodeTurnNotFound: "turn_not_found",
EditRetryReasonCodeTurnNotLatest: "turn_not_latest",
EditRetryReasonCodeTurnNotSettled: "turn_not_settled",
EditRetryReasonCodeHistoryRevisionConflict: "history_revision_conflict",
EditRetryReasonCodeOperationConflict: "operation_conflict",
EditRetryReasonCodeRecoveryRequired: "recovery_required",
EditRetryReasonCodeProviderOutcomeUnknown: "provider_outcome_unknown",
EditRetryReasonCodeReplacementNotProvenAbsent: "replacement_not_proven_absent",
}
for got, want := range reasons {
if string(got) != want {
t.Fatalf("EditRetryReasonCode = %q, want %q", got, want)
}
}
}
func TestEditRetryContractZeroValuesAreUncommitted(t *testing.T) {
if got := (RuntimeProviderDispatchResult{}); got.Disposition != "" || got.Acceptance != nil {
t.Fatalf("RuntimeProviderDispatchResult zero value = %#v", got)
}
if got := (RuntimeHistoryMutationResult{}); got.Disposition != "" || got.Snapshot != nil {
t.Fatalf("RuntimeHistoryMutationResult zero value = %#v", got)
}
if got := (EditRetryAvailability{}); got.Supported || got.Eligible ||
got.TurnID != "" || got.HistoryRevision != 0 || got.RecoveryState != "" ||
got.OperationID != "" || got.AvailableActions != nil || got.ReasonCode != "" {
t.Fatalf("EditRetryAvailability zero value = %#v", got)
}
if got := (EditRetryResult{}); got.State != "" || got.RetractedTurnID != "" ||
got.ReplacementTurnID != "" || got.HistoryRevision != 0 ||
got.OperationID != "" || got.ReasonCode != "" {
t.Fatalf("EditRetryResult zero value = %#v", got)
}
}
func TestEditRetryErrorSentinelsAreStableAndDistinct(t *testing.T) {
sentinels := []error{
ErrEditRetryNotEligible,
ErrEditRetryHistoryConflict,
ErrRuntimeHistoryUnsupported,
ErrEditRetryInProgress,
ErrEditRetryResendPending,
ErrEditRetryRecoveryRequired,
}
for index, sentinel := range sentinels {
if sentinel == nil || sentinel.Error() == "" {
t.Fatalf("sentinel %d is empty", index)
}
for other := index + 1; other < len(sentinels); other++ {
if errors.Is(sentinel, sentinels[other]) || errors.Is(sentinels[other], sentinel) {
t.Fatalf("sentinels %d and %d are not distinct", index, other)
}
}
}
}