Add review tests for notices, scene prompts, and Play lock.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -292,6 +292,35 @@ describe('GameScreen view restore', () => {
|
||||
expect(location.search).toContain('tab=people');
|
||||
});
|
||||
|
||||
it('disables Play while a pausing notice is open', () => {
|
||||
const screen = new GameScreen({
|
||||
onLeave: () => {},
|
||||
onSetRunning: () => {},
|
||||
onSetSpeed: () => {},
|
||||
onSkip: () => {},
|
||||
});
|
||||
document.body.append(screen.element);
|
||||
screen.show(school({ running: false }));
|
||||
|
||||
const play = screen.element.querySelector<HTMLButtonElement>('.clock__controls .button--icon');
|
||||
expect(play?.disabled).toBe(false);
|
||||
|
||||
screen.applyNotice({
|
||||
type: 'notice',
|
||||
id: 4,
|
||||
defName: 'GenerationFailed',
|
||||
severity: 2,
|
||||
pause: true,
|
||||
ttlMs: 0,
|
||||
personId: 0,
|
||||
action: 'none',
|
||||
});
|
||||
|
||||
expect(play?.disabled).toBe(true);
|
||||
expect(play?.title).toBe(t('noticePauseLocked'));
|
||||
expect(screen.element.querySelector('.notice-modal')).not.toBeNull();
|
||||
});
|
||||
|
||||
it('keeps a guest on overview even when the URL asks for manage', () => {
|
||||
history.replaceState(null, '', '/?school=3&mode=manage');
|
||||
const screen = new GameScreen({
|
||||
|
||||
@@ -53,6 +53,24 @@ public class EventDefTests
|
||||
Assert.Contains("fullMoon", ex.Message, StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void UnknownAction_FailsTheCatalog()
|
||||
{
|
||||
var documents = PackDocuments.FromDirectory(
|
||||
CatalogLoader.CorePackId,
|
||||
Path.Combine(AppContext.BaseDirectory, "vanilla"))
|
||||
.Append(PackDocuments.Def(
|
||||
CatalogLoader.CorePackId,
|
||||
"events",
|
||||
"bad-action",
|
||||
"""{ "defName": "BadAct", "severity": "info", "ttlMs": 1, "trigger": "dayStart", "action": "teleport" }"""))
|
||||
.ToList();
|
||||
|
||||
var ex = Assert.Throws<ContentLoadException>(() => _loader.Load([CatalogLoader.CorePackId], documents));
|
||||
Assert.Contains("action", ex.Message, StringComparison.Ordinal);
|
||||
Assert.Contains("teleport", ex.Message, StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
private DefCatalog LoadVanilla()
|
||||
{
|
||||
var root = Path.Combine(AppContext.BaseDirectory, "vanilla");
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using HSchool.Content;
|
||||
using HSchool.Server.Api;
|
||||
using HSchool.Server.Game;
|
||||
using HSchool.Simulation;
|
||||
|
||||
@@ -101,6 +102,56 @@ public class PortraitSceneCollectorTests
|
||||
Assert.DoesNotContain(scene.PositiveFragments, fragment => fragment.Contains("<embed:", StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CollectThenBuild_PutsBlackboardAfterClothing_ChairRoomDoesNot()
|
||||
{
|
||||
var catalog = LoadCatalog();
|
||||
var map = SampleMap();
|
||||
var profile = SwarmUiPresetDefinition.CreateDefault().ToProfile(PortraitKind.Avatar);
|
||||
var card = SampleWornCard();
|
||||
|
||||
var withBoard = PortraitSceneCollector.Collect(
|
||||
catalog, map, "class-1", Precipitation.None, "TestClimate", [], [], Budget);
|
||||
var (positive, _) = PortraitPromptBuilder.Build(card, profile, PortraitKind.Avatar, scene: withBoard);
|
||||
var clothesAt = positive.IndexOf("wearing a white shirt", StringComparison.OrdinalIgnoreCase);
|
||||
var sceneAt = positive.IndexOf("blackboard", StringComparison.OrdinalIgnoreCase);
|
||||
Assert.True(clothesAt >= 0 && sceneAt > clothesAt);
|
||||
|
||||
var chairs = PortraitSceneCollector.Collect(
|
||||
catalog, map, "chairs", Precipitation.None, "TestClimate", [], [], Budget);
|
||||
var (without, _) = PortraitPromptBuilder.Build(card, profile, PortraitKind.Avatar, scene: chairs);
|
||||
Assert.DoesNotContain("blackboard", without, StringComparison.OrdinalIgnoreCase);
|
||||
Assert.DoesNotContain("chair", without, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
private static PersonCardResponse SampleWornCard() =>
|
||||
new(
|
||||
"f0.c0",
|
||||
"Maria Ivanova",
|
||||
"Ivanova",
|
||||
"Maria",
|
||||
"",
|
||||
true,
|
||||
12,
|
||||
new DateTime(2000, 3, 14, 0, 0, 0, DateTimeKind.Utc),
|
||||
["student"],
|
||||
5,
|
||||
"A",
|
||||
"class-1",
|
||||
null,
|
||||
null,
|
||||
[new LabeledStatResponse("HairColor", "Hair colour", "Black")],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
null,
|
||||
null,
|
||||
new PersonFamilyResponse([], [], [], []),
|
||||
[new WornItemResponse("Shirt", "Shirt", "White", "White", [new DefLabelResponse(ApparelLayers.Top, "Top")], 1f, "new", [ApparelLayers.Underwear])],
|
||||
[],
|
||||
0f,
|
||||
0f);
|
||||
|
||||
private DefCatalog LoadCatalog()
|
||||
{
|
||||
return _loader.Load(
|
||||
|
||||
Reference in New Issue
Block a user