|
|
@@ -346,16 +346,16 @@ class ExamSprintReportApplicationServiceTest {
|
|
|
assertThat(content.reportSubtitle()).isEqualTo("2024真题 · 临考突击 · 真实提分效果");
|
|
|
assertThat(content.summaryMetrics().vocabularyGrowthText()).isEqualTo("+19");
|
|
|
assertThat(content.summaryMetrics().paperKnownWordsGrowthText()).isEqualTo("+4");
|
|
|
- assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("21.1%");
|
|
|
- assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("5.263158");
|
|
|
+ assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("1.93%");
|
|
|
+ assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("0.4825");
|
|
|
assertThat(content.stageVocabularySummary().stageName()).isEqualTo("高考");
|
|
|
assertThat(content.stageVocabularySummary().stageVocabularyText()).isEqualTo("3500");
|
|
|
assertThat(content.stageVocabularySummary().masteryImprovementText()).isEqualTo("+0.55");
|
|
|
assertThat(content.testPaperVocabularySummary().testPaperTitle()).isEqualTo("2024真题");
|
|
|
assertThat(content.testPaperVocabularySummary().testPaperWordCountText()).isEqualTo("861");
|
|
|
assertThat(content.testPaperVocabularySummary().masteryRateImprovementText()).isEqualTo("+0.62");
|
|
|
- assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("21.1%");
|
|
|
- assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("5.263158");
|
|
|
+ assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("1.93%");
|
|
|
+ assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("0.4825");
|
|
|
assertThat(content.examUnknownWordsHitStatus().hitWords())
|
|
|
.containsExactly("number", "bear", "popular", "importance");
|
|
|
}
|
|
|
@@ -382,9 +382,9 @@ class ExamSprintReportApplicationServiceTest {
|
|
|
.doesNotContain("ignored-large-array");
|
|
|
}
|
|
|
|
|
|
- /** 覆盖成果报告学生提分词数为零的边界场景,当分母为 0 时,应保存 0% 命中率与 0 学习效率。 */
|
|
|
+ /** 覆盖成果报告学生提分词数为零但调用方提供命中率场景,当保存领域内容时,应取 PaperMasteryHitRate 并按该命中率计算学习效率。 */
|
|
|
@Test
|
|
|
- void createAchievementReportStoresZeroPercentWhenStudentImproveWordCountIsZero() {
|
|
|
+ void createAchievementReportStoresPayloadMasteryRateWhenStudentImproveWordCountIsZero() {
|
|
|
TestRepository repository = new TestRepository();
|
|
|
DefaultExamSprintReportApplicationService service = service(repository, reportId -> { }, new TestStorage());
|
|
|
ObjectNode payload = validAchievementPayload().deepCopy();
|
|
|
@@ -394,26 +394,29 @@ class ExamSprintReportApplicationServiceTest {
|
|
|
var response = service.createAchievementReport(payload);
|
|
|
|
|
|
AchievementReportContent content = (AchievementReportContent) repository.findById(response.reportId()).orElseThrow().content();
|
|
|
- assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("0%");
|
|
|
- assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("0");
|
|
|
- assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("0%");
|
|
|
- assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("0");
|
|
|
+ assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("77.77%");
|
|
|
+ assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("19.4425");
|
|
|
+ assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("77.77%");
|
|
|
+ assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("19.4425");
|
|
|
}
|
|
|
|
|
|
- /** 覆盖成果报告学习效率舍入边界场景,当直接公式与中间舍入结果不同,应保存最终直接公式的 6 位小数。 */
|
|
|
+ /** 覆盖成果报告学习效率口径场景,当词数比例与 PaperMasteryHitRate 不一致时,应按 PaperMasteryHitRate 除以 0.04 计算。 */
|
|
|
@Test
|
|
|
- void createAchievementReportCalculatesLearningEfficiencyWithoutIntermediateRounding() {
|
|
|
+ void createAchievementReportCalculatesLearningEfficiencyFromPayloadMasteryRate() {
|
|
|
TestRepository repository = new TestRepository();
|
|
|
DefaultExamSprintReportApplicationService service = service(repository, reportId -> { }, new TestStorage());
|
|
|
ObjectNode payload = validAchievementPayload().deepCopy();
|
|
|
payload.put("TestPaperImprovedWordCount", 6);
|
|
|
payload.put("StudentImproveWordCount", 7);
|
|
|
+ payload.put("PaperMasteryHitRate", 33.333333);
|
|
|
|
|
|
var response = service.createAchievementReport(payload);
|
|
|
|
|
|
AchievementReportContent content = (AchievementReportContent) repository.findById(response.reportId()).orElseThrow().content();
|
|
|
- assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("21.428571");
|
|
|
- assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("21.428571");
|
|
|
+ assertThat(content.summaryMetrics().unknownWordHitRateText()).isEqualTo("33.333333%");
|
|
|
+ assertThat(content.summaryMetrics().learningEfficiencyText()).isEqualTo("8.333333");
|
|
|
+ assertThat(content.examUnknownWordsHitStatus().unknownWordHitRateText()).isEqualTo("33.333333%");
|
|
|
+ assertThat(content.examUnknownWordsHitStatus().learningEfficiencyText()).isEqualTo("8.333333");
|
|
|
}
|
|
|
|
|
|
/** 覆盖成果报告调用方 PascalCase 类型边界场景,当核心数字字段为 string 时,应在保存前校验失败。 */
|