summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop.Tests
diff options
context:
space:
mode:
Diffstat (limited to 'src/LivingVillage.Desktop.Tests')
-rw-r--r--src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj1
-rw-r--r--src/LivingVillage.Desktop.Tests/P78NightAmbienceTests.fs62
2 files changed, 63 insertions, 0 deletions
diff --git a/src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj b/src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj
index 1ea6349..5f2ac14 100644
--- a/src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj
+++ b/src/LivingVillage.Desktop.Tests/LivingVillage.Desktop.Tests.fsproj
@@ -49,6 +49,7 @@
<Compile Include="P75HudStripTests.fs" />
<Compile Include="P76HotbarPanelTests.fs" />
<Compile Include="P77LayoutTests.fs" />
+ <Compile Include="P78NightAmbienceTests.fs" />
<Compile Include="SampleTests.fs" />
</ItemGroup>
diff --git a/src/LivingVillage.Desktop.Tests/P78NightAmbienceTests.fs b/src/LivingVillage.Desktop.Tests/P78NightAmbienceTests.fs
new file mode 100644
index 0000000..2a06798
--- /dev/null
+++ b/src/LivingVillage.Desktop.Tests/P78NightAmbienceTests.fs
@@ -0,0 +1,62 @@
+namespace LivingVillage.Desktop.Tests
+
+open Microsoft.VisualStudio.TestTools.UnitTesting
+open LivingVillage.Desktop
+
+/// P78 夜晚氛围与场景细节回归(纯函数层):
+/// * 夜帧水面逐格微光斑:只落在水面/水田、帧号驱动且确定性、昼夜两档(白天恒 0);
+/// * 炊烟:生成器世界每户一个烟源、夜帧 alpha/尺寸更大、升腾摇晃有界且确定性;
+/// * 桥头灯柱近圈光晕:半径恒为 1 tile(窄光晕),复用既有灯柱瓦片。
+[<TestClass>]
+type P78NightAmbienceTests () =
+
+ let map = MapGen.generate (MapGen.defaultParams 42UL)
+
+ [<TestMethod>]
+ member _.WaterGlintsAreNightOnlyDeterministicAndTwoTier () =
+ let glints = SceneDetail.waterGlintTiles map
+ Assert.IsTrue(not (List.isEmpty glints), "生成器世界须有水面光斑候选格")
+ for (x, y) in glints do
+ Assert.IsTrue(SceneDetail.isWaterSurface map x y, sprintf "光斑 (%d,%d) 必须落在水面/水田" x y)
+ // 白天恒定关闭(零回归),夜帧两个亮度档。
+ for phase in 0 .. SceneDetail.waterGlintPhaseCount - 1 do
+ Assert.IsTrue((SceneDetail.waterGlintAlpha 0.0f phase) = 0, "白天光斑必须为 0(零回归)")
+ let nightBright = SceneDetail.waterGlintAlpha 1.0f 0
+ let nightDim = SceneDetail.waterGlintAlpha 1.0f 1
+ Assert.IsTrue(nightBright > 0, "夜帧光斑须可见")
+ Assert.IsTrue(nightBright > nightDim && nightDim > 0, "光斑须有两档呼吸层次")
+ // 帧号驱动且确定性。
+ for tick in [ 0L; 8L; 16L; 32L ] do
+ let phase = SceneDetail.waterGlintPhase tick 3 5
+ Assert.IsTrue(phase >= 0 && phase < SceneDetail.waterGlintPhaseCount, "相位越界")
+ Assert.IsTrue((SceneDetail.waterGlintPhase tick 3 5) = phase, "相位须确定性")
+ Assert.IsTrue(abs (SceneDetail.waterGlintOffset tick 3 5) <= 1, "光斑位移须有界 ±1px")
+ Assert.IsTrue(
+ (SceneDetail.waterGlintPhase 0L 3 5) <> (SceneDetail.waterGlintPhase 8L 3 5)
+ || (SceneDetail.waterGlintPhase 8L 3 5) <> (SceneDetail.waterGlintPhase 16L 3 5)
+ || (SceneDetail.waterGlintPhase 16L 3 5) <> (SceneDetail.waterGlintPhase 24L 3 5),
+ "光斑相位须随帧号变化")
+
+ [<TestMethod>]
+ member _.SmokeIsProminentAtNightAndDeterministic () =
+ let sources = SceneDetail.smokeSourceTiles map
+ let expected = (map.Buildings @ map.Farmhouses) |> List.length
+ Assert.IsTrue(not (List.isEmpty sources), "生成器世界须有炊烟源(民居/农舍)")
+ Assert.IsTrue(List.length sources <= expected, "去重后炊烟源数不得超过户数")
+ let dayAlpha = SceneDetail.smokeAlphaAt 0.0f
+ let nightAlpha = SceneDetail.smokeAlphaAt 1.0f
+ Assert.IsTrue(dayAlpha > 0, "白天炊烟仍须可辨")
+ Assert.IsTrue(nightAlpha > dayAlpha, "夜帧炊烟须更醒目")
+ Assert.IsTrue((SceneDetail.smokeCellSize 1.0f) > (SceneDetail.smokeCellSize 0.0f), "夜帧炊烟体量须更大")
+ for tick in [ 0L; 24L; 48L ] do
+ let frame = SceneDetail.smokeFrame tick
+ Assert.IsTrue(frame >= 0 && frame <= 2, "炊烟需三相位")
+ let sway, rise = SceneDetail.smokeDrift tick 7
+ Assert.IsTrue(abs sway <= 1, "炊烟摇曳须有界 ±1px")
+ Assert.IsTrue(rise <= 0 && rise >= -4, "炊烟只向上且位移有界")
+ Assert.IsTrue((SceneDetail.smokeDrift tick 7) = (sway, rise), "炊烟位移须确定性")
+
+ [<TestMethod>]
+ member _.BridgeHaloIsNarrowAndMatchesLanternTiles () =
+ Assert.IsTrue((SceneDetail.bridgeHaloRadiusTiles = 1), "桥头光晕须为窄光晕(1 tile)")
+ Assert.IsTrue((SceneDetail.bridgeLanternTiles map) = (VillageArt.bridgeLanternTiles map), "桥头灯柱瓦片须同源")