|
| 1 | +// Copyright (c) 2023-2026 ktsu-dev contributors |
| 2 | + |
| 3 | +namespace ktsu.CounterStrikeProgression.Test; |
| 4 | + |
| 5 | +using ktsu.CounterStrikeProgression.Core.Events; |
| 6 | +using ktsu.CounterStrikeProgression.Core.Floaties; |
| 7 | +using ktsu.CounterStrikeProgression.Core.Progression; |
| 8 | + |
| 9 | +[TestClass] |
| 10 | +public sealed class FloatieTests |
| 11 | +{ |
| 12 | + private const int Victim = 4; |
| 13 | + |
| 14 | + [TestMethod] |
| 15 | + public void QuickHitsOnOneTargetAddUp() |
| 16 | + { |
| 17 | + ProgressionEngine engine = TestHelpers.Engine(); |
| 18 | + PlayerProgress player = TestHelpers.Player(); |
| 19 | + FloatieMerger merger = new(0.75); |
| 20 | + |
| 21 | + FloatieUpdate? first = merger.Add(Victim, 1.0, engine.ApplyCombat(player, TestHelpers.Hit("ak47"))); |
| 22 | + FloatieUpdate? second = merger.Add(Victim, 1.2, engine.ApplyCombat(player, TestHelpers.Hit("ak47"))); |
| 23 | + FloatieUpdate? kill = merger.Add(Victim, 1.4, engine.ApplyCombat(player, TestHelpers.Kill("ak47"))); |
| 24 | + |
| 25 | + Assert.IsTrue(first!.IsNew); |
| 26 | + Assert.AreEqual("+1 XP", first.Text); |
| 27 | + Assert.IsFalse(second!.IsNew); |
| 28 | + Assert.AreEqual("+2 XP", second.Text); |
| 29 | + Assert.AreEqual("+12 XP", kill!.Text); |
| 30 | + Assert.IsFalse(kill.Highlight); |
| 31 | + } |
| 32 | + |
| 33 | + [TestMethod] |
| 34 | + public void AGapStartsANewFloatie() |
| 35 | + { |
| 36 | + ProgressionEngine engine = TestHelpers.Engine(); |
| 37 | + PlayerProgress player = TestHelpers.Player(); |
| 38 | + FloatieMerger merger = new(0.75); |
| 39 | + |
| 40 | + merger.Add(Victim, 1.0, engine.ApplyCombat(player, TestHelpers.Hit("ak47"))); |
| 41 | + FloatieUpdate? later = merger.Add(Victim, 2.0, engine.ApplyCombat(player, TestHelpers.Hit("ak47"))); |
| 42 | + |
| 43 | + Assert.IsTrue(later!.IsNew); |
| 44 | + Assert.AreEqual("+1 XP", later.Text); |
| 45 | + } |
| 46 | + |
| 47 | + [TestMethod] |
| 48 | + public void DifferentTargetsGetTheirOwnFloaties() |
| 49 | + { |
| 50 | + ProgressionEngine engine = TestHelpers.Engine(); |
| 51 | + PlayerProgress player = TestHelpers.Player(); |
| 52 | + FloatieMerger merger = new(0.75); |
| 53 | + |
| 54 | + merger.Add(Victim, 1.0, engine.ApplyCombat(player, TestHelpers.Hit("ak47"))); |
| 55 | + FloatieUpdate? other = merger.Add(Victim + 1, 1.1, engine.ApplyCombat(player, TestHelpers.Hit("ak47"))); |
| 56 | + |
| 57 | + Assert.IsTrue(other!.IsNew); |
| 58 | + Assert.AreEqual(Victim + 1, other.Key); |
| 59 | + } |
| 60 | + |
| 61 | + [TestMethod] |
| 62 | + public void SkillShotsAreNamedAndHighlighted() |
| 63 | + { |
| 64 | + ProgressionEngine engine = TestHelpers.Engine(s => s.RareSkillTiers = [1000, 2000, 3000, 4000, 5000]); |
| 65 | + PlayerProgress player = TestHelpers.Player(); |
| 66 | + FloatieMerger merger = new(0.75); |
| 67 | + |
| 68 | + FloatieUpdate? update = merger.Add(Victim, 1.0, engine.ApplyCombat(player, TestHelpers.Hit("ak47") with { Attacker = new PlayerState { OnGround = false } })); |
| 69 | + |
| 70 | + Assert.AreEqual("+26 XP\nJumpshot", update!.Text); |
| 71 | + Assert.IsTrue(update.Highlight); |
| 72 | + } |
| 73 | + |
| 74 | + [TestMethod] |
| 75 | + public void OnlyTheNewestTwoMomentsAreShownWithoutRepeats() |
| 76 | + { |
| 77 | + ProgressionEngine engine = TestHelpers.Engine(s => |
| 78 | + { |
| 79 | + s.RareSkillTiers = [1000, 2000, 3000, 4000, 5000]; |
| 80 | + s.EpicSkillTiers = [1000, 2000, 3000, 4000, 5000]; |
| 81 | + s.CommonSkillTiers = [1000, 2000, 3000, 4000, 5000]; |
| 82 | + }); |
| 83 | + PlayerProgress player = TestHelpers.Player(); |
| 84 | + FloatieMerger merger = new(0.75); |
| 85 | + PlayerState airborne = new() { OnGround = false }; |
| 86 | + |
| 87 | + merger.Add(Victim, 1.0, engine.ApplyCombat(player, TestHelpers.Hit("ak47") with { Attacker = airborne })); |
| 88 | + merger.Add(Victim, 1.1, engine.ApplyCombat(player, TestHelpers.Hit("ak47") with { Attacker = airborne })); |
| 89 | + FloatieUpdate? update = merger.Add(Victim, 1.2, engine.ApplyCombat(player, TestHelpers.Kill("ak47") with { Attacker = airborne, AttackerBlind = true })); |
| 90 | + |
| 91 | + string[] lines = update!.Text.Split('\n'); |
| 92 | + Assert.HasCount(3, lines); |
| 93 | + Assert.AreEqual("Blind kill", lines[1]); |
| 94 | + Assert.AreEqual("Jumpshot", lines[2]); |
| 95 | + } |
| 96 | + |
| 97 | + [TestMethod] |
| 98 | + public void BotHitsShowFractions() |
| 99 | + { |
| 100 | + ProgressionEngine engine = TestHelpers.Engine(); |
| 101 | + PlayerProgress player = TestHelpers.Player(); |
| 102 | + FloatieMerger merger = new(0.75); |
| 103 | + |
| 104 | + FloatieUpdate? update = merger.Add(Victim, 1.0, engine.ApplyCombat(player, TestHelpers.Hit("ak47") with { VictimIsBot = true })); |
| 105 | + |
| 106 | + Assert.AreEqual("+0.25 XP", update!.Text); |
| 107 | + } |
| 108 | + |
| 109 | + [TestMethod] |
| 110 | + public void NothingEarnedShowsNothing() |
| 111 | + { |
| 112 | + ProgressionEngine engine = TestHelpers.Engine(); |
| 113 | + PlayerProgress player = TestHelpers.Player(); |
| 114 | + FloatieMerger merger = new(0.75); |
| 115 | + |
| 116 | + Assert.IsNull(merger.Add(Victim, 1.0, engine.ApplyCombat(player, TestHelpers.Hit("ak47") with { IsTeammate = true }))); |
| 117 | + } |
| 118 | + |
| 119 | + [TestMethod] |
| 120 | + public void ExpiredFloatiesStartFresh() |
| 121 | + { |
| 122 | + ProgressionEngine engine = TestHelpers.Engine(); |
| 123 | + PlayerProgress player = TestHelpers.Player(); |
| 124 | + FloatieMerger merger = new(0.75); |
| 125 | + |
| 126 | + merger.Add(Victim, 1.0, engine.ApplyCombat(player, TestHelpers.Hit("ak47"))); |
| 127 | + merger.Expire(5.0); |
| 128 | + |
| 129 | + Assert.IsTrue(merger.Add(Victim, 1.1, engine.ApplyCombat(player, TestHelpers.Hit("ak47")))!.IsNew); |
| 130 | + } |
| 131 | + |
| 132 | + [TestMethod] |
| 133 | + [DataRow(0.25, "0.25")] |
| 134 | + [DataRow(2.5, "2.5")] |
| 135 | + [DataRow(3.0, "3")] |
| 136 | + [DataRow(12.75, "13")] |
| 137 | + [DataRow(1250.0, "1,250")] |
| 138 | + public void XpIsFormattedForFloaties(double xp, string expected) => Assert.AreEqual(expected, FloatieMerger.FormatXp(xp)); |
| 139 | +} |
0 commit comments