feat(cordis): 完成阶段5访问介导与诊断
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#nullable enable
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using NUnit.Framework;
|
||||
using ShrinkContext;
|
||||
@@ -155,6 +156,57 @@ namespace ShrinkContext.Tests
|
||||
Assert.AreEqual(ShrinkFiberState.Active, firstFiber.State);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void UndeclaredSupply_FailsFiberAndLeavesNoBinding()
|
||||
{
|
||||
var fiber = _runtime.Use(new UndeclaredProviderComponent());
|
||||
|
||||
Assert.AreEqual(ShrinkFiberState.Inactive, fiber.State);
|
||||
Assert.IsInstanceOf<ShrinkUndeclaredSupplyException>(fiber.LastError);
|
||||
Assert.IsFalse(_runtime.TryGetRaw<int>(_runtime.RootContext, "not-declared", out _));
|
||||
|
||||
var snapshot = _runtime.CaptureDiagnostic();
|
||||
var diagnostic = snapshot.Fibers.Single(item => item.Uid == fiber.Uid);
|
||||
Assert.AreEqual(ShrinkFiberDiagnosticStatus.Failed, diagnostic.Status);
|
||||
StringAssert.Contains("not-declared", diagnostic.ErrorMessage);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DiagnosticSnapshot_ExplainsWaitingDependencyAndPotentialProvider()
|
||||
{
|
||||
var waiting = _runtime.Use(new ConsumerComponent("waiting", "svc"));
|
||||
var blockedProvider = _runtime.Use(new ProviderComponent("blocked-provider", "svc")
|
||||
{
|
||||
Inject = new[] { "missing" }
|
||||
});
|
||||
|
||||
var snapshot = _runtime.CaptureDiagnostic();
|
||||
var waitingDiagnostic = snapshot.Fibers.Single(item => item.Uid == waiting.Uid);
|
||||
Assert.AreEqual(ShrinkFiberDiagnosticStatus.Waiting, waitingDiagnostic.Status);
|
||||
Assert.AreEqual(1, waitingDiagnostic.Dependencies.Count);
|
||||
Assert.IsFalse(waitingDiagnostic.Dependencies[0].IsSatisfied);
|
||||
CollectionAssert.Contains(waitingDiagnostic.Dependencies[0].PotentialProviderUids,
|
||||
blockedProvider.Uid,
|
||||
"等待链应显示声明了该键、但自身依赖未满足的潜在提供者");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void NotifyIndex_VisitsOnlyConsumersOfChangedKey()
|
||||
{
|
||||
var target = new ConsumerComponent("target", "target-key");
|
||||
_runtime.Use(target);
|
||||
for (var i = 0; i < 40; i++)
|
||||
_runtime.Use(new ConsumerComponent("unrelated-" + i, "other-" + i));
|
||||
|
||||
_runtime.Use(new ProviderComponent("provider", "target-key", "value"));
|
||||
|
||||
var notifications = _runtime.CaptureDiagnostic().Notifications;
|
||||
Assert.AreEqual(1, notifications.LastCandidateCount,
|
||||
"notify 应从 key 倒排索引取得候选,不扫描 40 个无关 fiber");
|
||||
Assert.AreEqual(41, notifications.IndexedKeyCount);
|
||||
Assert.AreEqual("value", target.LastSeen);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CircularDependencies_BothStayInactiveWithoutError()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user