|
@@ -70,6 +70,12 @@ class ClasspathAchievementExamSprintReportRendererTest {
|
|
|
.contains("模块一:词汇量对比")
|
|
.contains("模块一:词汇量对比")
|
|
|
.contains("模块二:试卷熟词量对比")
|
|
.contains("模块二:试卷熟词量对比")
|
|
|
.contains("模块三:实考生词命中状况")
|
|
.contains("模块三:实考生词命中状况")
|
|
|
|
|
+ .contains("class=\"result-value\">1.93%</div>")
|
|
|
|
|
+ .contains("class=\"result-value\">0.48倍</div>")
|
|
|
|
|
+ .contains("class=\"hit-stat-value\">1.93%</div>")
|
|
|
|
|
+ .contains("class=\"hit-stat-value\">0.48倍</div>")
|
|
|
|
|
+ .contains("class=\"hit-stat-value\">207 个</div>")
|
|
|
|
|
+ .contains("class=\"hit-stat-value\">203 个</div>")
|
|
|
.contains("class='achievement-bar-chart vocabulary-growth-chart'")
|
|
.contains("class='achievement-bar-chart vocabulary-growth-chart'")
|
|
|
.contains("class='achievement-bar-chart paper-known-words-chart'")
|
|
.contains("class='achievement-bar-chart paper-known-words-chart'")
|
|
|
.contains("chart-y-axis")
|
|
.contains("chart-y-axis")
|
|
@@ -90,7 +96,11 @@ class ClasspathAchievementExamSprintReportRendererTest {
|
|
|
.doesNotContain("<script")
|
|
.doesNotContain("<script")
|
|
|
.doesNotContain("comparison-table")
|
|
.doesNotContain("comparison-table")
|
|
|
.doesNotContain("chart-cell")
|
|
.doesNotContain("chart-cell")
|
|
|
- .doesNotContain("detail-cell");
|
|
|
|
|
|
|
+ .doesNotContain("detail-cell")
|
|
|
|
|
+ .doesNotContain("class=\"result-value\">0.0193</div>")
|
|
|
|
|
+ .doesNotContain("class=\"result-value\">0.48</div>")
|
|
|
|
|
+ .doesNotContain("class=\"hit-stat-value\">207</div>")
|
|
|
|
|
+ .doesNotContain("class=\"hit-stat-value\">203</div>");
|
|
|
|
|
|
|
|
assertThat(countOccurrences(html, "class='chart-grid-line'")).isEqualTo(6);
|
|
assertThat(countOccurrences(html, "class='chart-grid-line'")).isEqualTo(6);
|
|
|
assertThat(countOccurrences(html, "class='chart-tick-label'")).isEqualTo(6);
|
|
assertThat(countOccurrences(html, "class='chart-tick-label'")).isEqualTo(6);
|
|
@@ -186,8 +196,103 @@ class ClasspathAchievementExamSprintReportRendererTest {
|
|
|
|
|
|
|
|
assertThat(html)
|
|
assertThat(html)
|
|
|
.contains("<h1 class=\"report-title\">{{hitWords}}</h1>")
|
|
.contains("<h1 class=\"report-title\">{{hitWords}}</h1>")
|
|
|
|
|
+ .contains("训练前词汇量:<span class=\"highlight\">{{hitWords}}</span><br/>")
|
|
|
.contains(">{{hitWords}}</text>")
|
|
.contains(">{{hitWords}}</text>")
|
|
|
- .contains("class=\"word-item\">number</div>");
|
|
|
|
|
|
|
+ .contains("class=\"word-item\">number</div>")
|
|
|
|
|
+ .doesNotContain("{{hitWords}} 词");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void renderKeepsLegacyUnitTextIdempotent() throws Exception {
|
|
|
|
|
+ ClasspathAchievementExamSprintReportRenderer renderer = new ClasspathAchievementExamSprintReportRenderer();
|
|
|
|
|
+ AchievementReportContent content = sampleContent();
|
|
|
|
|
+ AchievementReportContent mutated = new AchievementReportContent(
|
|
|
|
|
+ content.reportTitle(),
|
|
|
|
|
+ content.reportSubtitle(),
|
|
|
|
|
+ content.completionTitle(),
|
|
|
|
|
+ content.completionSubtitle(),
|
|
|
|
|
+ new AchievementReportContent.SummaryMetrics(
|
|
|
|
|
+ content.summaryMetrics().vocabularyGrowthText(),
|
|
|
|
|
+ content.summaryMetrics().paperKnownWordsGrowthText(),
|
|
|
|
|
+ "1.93%",
|
|
|
|
|
+ "0.48倍"),
|
|
|
|
|
+ new AchievementReportContent.Comparison(
|
|
|
|
|
+ content.vocabularyComparison().beforeValue(),
|
|
|
|
|
+ content.vocabularyComparison().afterValue(),
|
|
|
|
|
+ "2328 词",
|
|
|
|
|
+ "2347词",
|
|
|
|
|
+ "+19 词"),
|
|
|
|
|
+ new AchievementReportContent.Comparison(
|
|
|
|
|
+ content.paperKnownWordsComparison().beforeValue(),
|
|
|
|
|
+ content.paperKnownWordsComparison().afterValue(),
|
|
|
|
|
+ "650 个",
|
|
|
|
|
+ "654个",
|
|
|
|
|
+ "+4 个"),
|
|
|
|
|
+ new AchievementReportContent.ExamUnknownWordsHitStatus(
|
|
|
|
|
+ "1.93%",
|
|
|
|
|
+ "0.48倍",
|
|
|
|
|
+ "207 个",
|
|
|
|
|
+ "203个",
|
|
|
|
|
+ "4 个",
|
|
|
|
|
+ content.examUnknownWordsHitStatus().hitWords()));
|
|
|
|
|
+
|
|
|
|
|
+ String html = renderer.render(mutated, Instant.parse("2026-04-25T08:00:00Z"));
|
|
|
|
|
+
|
|
|
|
|
+ assertThat(html)
|
|
|
|
|
+ .contains("class=\"result-value\">1.93%</div>")
|
|
|
|
|
+ .contains("class=\"result-value\">0.48倍</div>")
|
|
|
|
|
+ .contains("训练前词汇量:<span class=\"highlight\">2328 词</span><br/>")
|
|
|
|
|
+ .contains("训练后词汇量:<span class=\"highlight\">2347词</span><br/>")
|
|
|
|
|
+ .contains("本次提升:<span class=\"highlight\">+19 词</span>")
|
|
|
|
|
+ .contains("训练前熟词量:<span class=\"highlight\">650 个</span><br/>")
|
|
|
|
|
+ .contains("训练后熟词量:<span class=\"highlight\">654个</span><br/>")
|
|
|
|
|
+ .contains("本次提升:<span class=\"highlight\">+4 个</span>")
|
|
|
|
|
+ .contains("class=\"hit-stat-value\">1.93%</div>")
|
|
|
|
|
+ .contains("class=\"hit-stat-value\">0.48倍</div>")
|
|
|
|
|
+ .contains("class=\"hit-stat-value\">207 个</div>")
|
|
|
|
|
+ .contains("class=\"hit-stat-value\">203个</div>")
|
|
|
|
|
+ .contains("成功减少生词:<span class=\"highlight\">4 个</span>")
|
|
|
|
|
+ .doesNotContain("1.93%%")
|
|
|
|
|
+ .doesNotContain("0.48倍倍")
|
|
|
|
|
+ .doesNotContain("2328 词 词")
|
|
|
|
|
+ .doesNotContain("2347词 词")
|
|
|
|
|
+ .doesNotContain("650 个 个")
|
|
|
|
|
+ .doesNotContain("654个 个")
|
|
|
|
|
+ .doesNotContain("207 个 个")
|
|
|
|
|
+ .doesNotContain("203个 个");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void renderKeepsNonFinitePercentTextUnchanged() throws Exception {
|
|
|
|
|
+ ClasspathAchievementExamSprintReportRenderer renderer = new ClasspathAchievementExamSprintReportRenderer();
|
|
|
|
|
+ AchievementReportContent content = sampleContent();
|
|
|
|
|
+ AchievementReportContent mutated = new AchievementReportContent(
|
|
|
|
|
+ content.reportTitle(),
|
|
|
|
|
+ content.reportSubtitle(),
|
|
|
|
|
+ content.completionTitle(),
|
|
|
|
|
+ content.completionSubtitle(),
|
|
|
|
|
+ new AchievementReportContent.SummaryMetrics(
|
|
|
|
|
+ content.summaryMetrics().vocabularyGrowthText(),
|
|
|
|
|
+ content.summaryMetrics().paperKnownWordsGrowthText(),
|
|
|
|
|
+ "NaN",
|
|
|
|
|
+ content.summaryMetrics().learningEfficiencyText()),
|
|
|
|
|
+ content.vocabularyComparison(),
|
|
|
|
|
+ content.paperKnownWordsComparison(),
|
|
|
|
|
+ new AchievementReportContent.ExamUnknownWordsHitStatus(
|
|
|
|
|
+ "Infinity",
|
|
|
|
|
+ content.examUnknownWordsHitStatus().learningEfficiencyText(),
|
|
|
|
|
+ content.examUnknownWordsHitStatus().unknownWordsBeforeText(),
|
|
|
|
|
+ content.examUnknownWordsHitStatus().unknownWordsAfterText(),
|
|
|
|
|
+ content.examUnknownWordsHitStatus().reducedUnknownWordsText(),
|
|
|
|
|
+ content.examUnknownWordsHitStatus().hitWords()));
|
|
|
|
|
+
|
|
|
|
|
+ String html = renderer.render(mutated, Instant.parse("2026-04-25T08:00:00Z"));
|
|
|
|
|
+
|
|
|
|
|
+ assertThat(html)
|
|
|
|
|
+ .contains("class=\"result-value\">NaN</div>")
|
|
|
|
|
+ .contains("class=\"hit-stat-value\">Infinity</div>")
|
|
|
|
|
+ .doesNotContain("class=\"result-value\">0%</div>")
|
|
|
|
|
+ .doesNotContain("class=\"hit-stat-value\">0%</div>");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private AchievementReportContent sampleContent() throws Exception {
|
|
private AchievementReportContent sampleContent() throws Exception {
|
|
@@ -279,29 +384,29 @@ class ClasspathAchievementExamSprintReportRendererTest {
|
|
|
"summaryMetrics": {
|
|
"summaryMetrics": {
|
|
|
"vocabularyGrowthText": "+19",
|
|
"vocabularyGrowthText": "+19",
|
|
|
"paperKnownWordsGrowthText": "+4",
|
|
"paperKnownWordsGrowthText": "+4",
|
|
|
- "unknownWordHitRateText": "1.93%",
|
|
|
|
|
- "learningEfficiencyText": "0.48倍"
|
|
|
|
|
|
|
+ "unknownWordHitRateText": "0.0193",
|
|
|
|
|
+ "learningEfficiencyText": "0.48"
|
|
|
},
|
|
},
|
|
|
"vocabularyComparison": {
|
|
"vocabularyComparison": {
|
|
|
"beforeValue": 2328,
|
|
"beforeValue": 2328,
|
|
|
"afterValue": 2347,
|
|
"afterValue": 2347,
|
|
|
- "beforeText": "2328 词",
|
|
|
|
|
- "afterText": "2347 词",
|
|
|
|
|
- "growthText": "+19 词"
|
|
|
|
|
|
|
+ "beforeText": "2328",
|
|
|
|
|
+ "afterText": "2347",
|
|
|
|
|
+ "growthText": "+19"
|
|
|
},
|
|
},
|
|
|
"paperKnownWordsComparison": {
|
|
"paperKnownWordsComparison": {
|
|
|
"beforeValue": 650,
|
|
"beforeValue": 650,
|
|
|
"afterValue": 654,
|
|
"afterValue": 654,
|
|
|
- "beforeText": "650 个",
|
|
|
|
|
- "afterText": "654 个",
|
|
|
|
|
- "growthText": "+4 个"
|
|
|
|
|
|
|
+ "beforeText": "650",
|
|
|
|
|
+ "afterText": "654",
|
|
|
|
|
+ "growthText": "+4"
|
|
|
},
|
|
},
|
|
|
"examUnknownWordsHitStatus": {
|
|
"examUnknownWordsHitStatus": {
|
|
|
- "unknownWordHitRateText": "1.93%",
|
|
|
|
|
- "learningEfficiencyText": "0.48倍",
|
|
|
|
|
- "unknownWordsBeforeText": "207 个",
|
|
|
|
|
- "unknownWordsAfterText": "203 个",
|
|
|
|
|
- "reducedUnknownWordsText": "4 个",
|
|
|
|
|
|
|
+ "unknownWordHitRateText": "0.0193",
|
|
|
|
|
+ "learningEfficiencyText": "0.48",
|
|
|
|
|
+ "unknownWordsBeforeText": "207",
|
|
|
|
|
+ "unknownWordsAfterText": "203",
|
|
|
|
|
+ "reducedUnknownWordsText": "4",
|
|
|
"hitWords": ["number", "bear", "popular", "importance"]
|
|
"hitWords": ["number", "bear", "popular", "importance"]
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|