58 lines
2.3 KiB
C#
58 lines
2.3 KiB
C#
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<DashboardSystemPerformance> Systems(int learning, int practicing, int strong, int mastered, int hard)
|
|
{
|
|
var result = new List<DashboardSystemPerformance>();
|
|
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;
|
|
}
|
|
}
|