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
78 lines
2.9 KiB
Go
78 lines
2.9 KiB
Go
package workspaceissues
|
|
|
|
import (
|
|
"math"
|
|
"testing"
|
|
)
|
|
|
|
func TestNormalizeBudgetRejectsNonFinitePercentages(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
for _, test := range []struct {
|
|
name string
|
|
budget Budget
|
|
}{
|
|
{name: "quota nan", budget: Budget{Mode: BudgetModeAuto, QuotaWaterlinePercent: math.NaN()}},
|
|
{name: "quota positive infinity", budget: Budget{Mode: BudgetModeAuto, QuotaWaterlinePercent: math.Inf(1)}},
|
|
{name: "quota negative infinity", budget: Budget{Mode: BudgetModeAuto, QuotaWaterlinePercent: math.Inf(-1)}},
|
|
{name: "remaining nan", budget: Budget{Mode: BudgetModeAuto, HasRemainingQuota: true, RemainingQuotaPercent: math.NaN()}},
|
|
{name: "remaining positive infinity", budget: Budget{Mode: BudgetModeAuto, HasRemainingQuota: true, RemainingQuotaPercent: math.Inf(1)}},
|
|
{name: "remaining negative infinity", budget: Budget{Mode: BudgetModeAuto, HasRemainingQuota: true, RemainingQuotaPercent: math.Inf(-1)}},
|
|
{name: "unobserved remaining nan", budget: Budget{Mode: BudgetModeAuto, RemainingQuotaPercent: math.NaN()}},
|
|
{name: "unobserved remaining infinity", budget: Budget{Mode: BudgetModeAuto, RemainingQuotaPercent: math.Inf(1)}},
|
|
} {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
if normalized, ok := NormalizeBudget(test.budget); ok {
|
|
t.Fatalf("NormalizeBudget(%s) = %#v, want rejection", test.name, normalized)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestIssueAutomaticRunAdmissionSlotsCombinesWorkspaceAndIssueLimits(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
issue := Issue{
|
|
Budget: Budget{
|
|
Status: BudgetStatusActive,
|
|
TokenLimit: CompileEstimatedRunTokenBudget(ExecutionProfile{}) * 4,
|
|
},
|
|
}
|
|
if got := IssueAutomaticRunAdmissionSlots(issue, 3, 1); got != 1 {
|
|
t.Fatalf("IssueAutomaticRunAdmissionSlots() = %d, want workspace-limited 1", got)
|
|
}
|
|
if got := IssueAutomaticRunAdmissionSlots(issue, 2, 2); got != 2 {
|
|
t.Fatalf("IssueAutomaticRunAdmissionSlots() = %d, want budget-limited 2", got)
|
|
}
|
|
}
|
|
|
|
func TestIssueTaskEligibleForRunRequiresAcceptedDependencies(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
dependency := Task{
|
|
TaskID: "dependency",
|
|
Status: StatusCompleted,
|
|
AcceptanceState: AcceptanceUserAccepted,
|
|
}
|
|
task := Task{
|
|
TaskID: "task",
|
|
Status: StatusNotStarted,
|
|
AgentTargetID: "local:codex",
|
|
DependencyTaskIDs: []string{dependency.TaskID},
|
|
}
|
|
byID := map[string]Task{dependency.TaskID: dependency, task.TaskID: task}
|
|
if !IssueTaskEligibleForRun(task, byID) {
|
|
t.Fatal("IssueTaskEligibleForRun() = false, want accepted dependency eligible")
|
|
}
|
|
dependency.AcceptanceState = AcceptanceAgentClaimed
|
|
byID[dependency.TaskID] = dependency
|
|
if IssueTaskEligibleForRun(task, byID) {
|
|
t.Fatal("IssueTaskEligibleForRun() = true, want unaccepted dependency rejected")
|
|
}
|
|
delete(byID, dependency.TaskID)
|
|
if IssueTaskEligibleForRun(task, byID) {
|
|
t.Fatal("IssueTaskEligibleForRun() = true, want missing dependency rejected")
|
|
}
|
|
}
|