using QuestionsApi.Models; using QuestionsApi.Services; using Xunit; namespace QuestionsApi.Tests; public sealed class ProgressionPolicyTests { [Fact] public void New_learner_starts_as_case_scout_three() { Assert.Equal(0, ProgressionPolicy.Qualified([], 0)); Assert.Equal("Case Scout", ProgressionPolicy.Name(0)); Assert.Equal("III", ProgressionPolicy.Division(0)); } [Fact] public void Pattern_hunter_requires_every_visible_gate() { var systems = Systems(learning: 6, practicing: 2, strong: 0, mastered: 0, hard: 6); Assert.Equal(1, ProgressionPolicy.Qualified(systems, 0)); Assert.Equal(3, ProgressionPolicy.Qualified(systems, 1)); Assert.Equal("Pattern Hunter", ProgressionPolicy.Name(3)); Assert.Equal("III", ProgressionPolicy.Division(3)); } [Fact] public void Highest_division_requires_breadth_challenge_and_retention() { var systems = Systems(learning: 14, practicing: 14, strong: 14, mastered: 12, hard: 105); Assert.Equal(13, ProgressionPolicy.Qualified(systems, 20)); Assert.Equal(14, ProgressionPolicy.Qualified(systems, 21)); Assert.Equal("Clinical Vanguard", ProgressionPolicy.Name(14)); Assert.Equal("I", ProgressionPolicy.Division(14)); } [Theory] [InlineData("unseen", 0)] [InlineData("learning", 1)] [InlineData("practicing", 2)] [InlineData("strong", 3)] [InlineData("mastered", 4)] public void Mastery_states_have_stable_order(string state, int expected) => Assert.Equal(expected, ProgressionPolicy.State(state)); private static List Systems(int learning, int practicing, int strong, int mastered, int hard) { var result = new List(); for (var i = 0; i < 14; i++) { var state = i < mastered ? MasteryStates.Mastered : i < strong ? MasteryStates.Strong : i < practicing ? MasteryStates.Practicing : i < learning ? MasteryStates.Learning : MasteryStates.Unseen; result.Add(new DashboardSystemPerformance { System = $"s{i}", MasteryState = state }); } for (var i = 0; i < hard; i++) result[i % result.Count].Difficulty4PlusSuccessful++; return result; } }