diff --git a/packages/oracles/tests/oracle-property-self-oracle.test.ts b/packages/oracles/tests/oracle-property-self-oracle.test.ts index 8f715c8..aa4e604 100644 --- a/packages/oracles/tests/oracle-property-self-oracle.test.ts +++ b/packages/oracles/tests/oracle-property-self-oracle.test.ts @@ -2864,6 +2864,9 @@ const frameworkStates = [ ...timeoutReceivingStates, `timeout-presentation-equivalence`, `timeout-continuation-cut`, + // A slow spec that fails to load, in a plan that presents timeouts: the + // narrowed case of the timeout obligation (#59). + `timeout-presentation-load-failure`, ...round3FrameworkStates, `auxiliary-late-error`, `bound-enumerated-label-selector`, @@ -3888,6 +3891,11 @@ function frameworkReach( ) ) reached.add(`timeout-presentation-equivalence`) + if ( + plan.timeoutPresentation && + plan.specs.some((spec) => spec.slow && !expected.get(spec.id)!.loads) + ) + reached.add(`timeout-presentation-load-failure`) if ( trace.some( ({ checkpoint, value }) => @@ -6354,7 +6362,9 @@ function checkSuite( ) if ( plan.timeoutPresentation && - plan.specs.some((spec) => spec.slow) && + // A slow spec that fails to load never runs its driver, so it owes no + // timed-out call to present; the model's load expectation decides. + plan.specs.some((spec) => spec.slow && expected.get(spec.id)!.loads) && !trace.some( ({ checkpoint, value }) => checkpoint === `timeout-presentation` && @@ -9106,6 +9116,17 @@ oracleProperty({ enters: [`timeout-presentation-equivalence`], history: timeoutRepresentationSuite(), }, + { + // The shrunk case of #59: a slow spec that fails to load never runs + // its driver, so the timeout obligation must not apply to it. + name: `timeout presentation of a slow spec that fails to load`, + enters: [`registration-error`, `timeout-presentation-load-failure`], + history: { + seedless: false, + timeoutPresentation: true, + drafts: [generatedDraft({ timing: `slow`, ownsMode: `empty` })], + }, + }, ...([`wrapper`, `reason`, `combined`] as const).map((axis) => ({ name: `round11 outer wrapper ${axis}`, enters: [...callbackReceivingStates, ...callbackRepresentationStates],