BlankPlaceholderRendererTest.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. namespace Tests\Unit;
  3. use App\Support\BlankPlaceholderRenderer;
  4. use PHPUnit\Framework\TestCase;
  5. class BlankPlaceholderRendererTest extends TestCase
  6. {
  7. public function test_fill_stem_canonical_2562_dollar_around_a_only(): void
  8. {
  9. // questions.id=2562 本源:$a$ 与横线分段,横线在 $…$ 外;不得出现 </span>$时 这类误插 $。
  10. $stem = '当$a$=__________时,$2(2a-3)$的值比$3(a+1)$的值大$1$.';
  11. [$rendered, $changed] = BlankPlaceholderRenderer::replaceToBlankSpan(
  12. $stem,
  13. BlankPlaceholderRenderer::defaultBlankSpan(),
  14. false,
  15. false
  16. );
  17. $this->assertTrue($changed);
  18. $this->assertStringNotContainsString('</span>$时', $rendered);
  19. $this->assertMatchesRegularExpression('/\$2\(2a-3\)\$/u', $rendered);
  20. $this->assertMatchesRegularExpression('/当\$a\$=/u', $rendered);
  21. }
  22. public function test_fill_stem_malformed_missing_close_dollar_before_han_still_repaired(): void
  23. {
  24. // 脏数据:仅 $a=__________($a 与横线同一数学段且漏写收尾 $)时补闭合,避免吞段。
  25. $stem = '当$a=__________时,$2(2a-3)$的值比$3(a+1)$的值大$1$.';
  26. [$rendered, $changed] = BlankPlaceholderRenderer::replaceToBlankSpan(
  27. $stem,
  28. BlankPlaceholderRenderer::defaultBlankSpan(),
  29. false,
  30. false
  31. );
  32. $this->assertTrue($changed);
  33. $this->assertStringNotContainsString('</span>$时', $rendered);
  34. $this->assertMatchesRegularExpression('/\$2\(2a-3\)\$/u', $rendered);
  35. }
  36. public function test_inline_math_with_normal_parentheses_not_turned_to_blank(): void
  37. {
  38. $stem = '设$f(x)=\sin(x)$,则$g(2)$的值是__________。';
  39. [$rendered] = BlankPlaceholderRenderer::replaceToBlankSpan(
  40. $stem,
  41. BlankPlaceholderRenderer::defaultBlankSpan(),
  42. false,
  43. false
  44. );
  45. $this->assertStringContainsString('sin(x)', $rendered);
  46. $this->assertStringContainsString('g(2)', $rendered);
  47. $this->assertStringContainsString('border-bottom:1.2px dashed', $rendered);
  48. }
  49. public function test_left_quad_right_not_at_suffix_stays_in_formula(): void
  50. {
  51. // 段末不是「…=\left(\quad\right)」完整后缀时,不转为下划线(避免误伤中段记号)。
  52. $stem = '若$x=\left(\quad\right)+1$,则$y=__________。';
  53. [$rendered] = BlankPlaceholderRenderer::replaceToBlankSpan(
  54. $stem,
  55. BlankPlaceholderRenderer::defaultBlankSpan(),
  56. false,
  57. false
  58. );
  59. $this->assertStringContainsString('\\left(\\quad\\right)', $rendered);
  60. }
  61. public function test_fill_degree_after_plain_blank_not_prefixed_with_stray_dollar(): void
  62. {
  63. // questions.id=332:inline $40^{\circ}$ 后又出现「向左拐______度」,中间无 $;
  64. // closeMissing 不得误用上一段公式的收尾 $,否则会出现「……横线 $度」。
  65. $stem = '一辆汽车在笔直的公路上行驶,第一次向左拐 $40^{\circ}$,若经第二次拐弯后,运动路线与原来的路线平行,则第二次拐弯是否向右拐或向左拐______度。';
  66. [$rendered] = BlankPlaceholderRenderer::replaceToBlankSpan(
  67. $stem,
  68. BlankPlaceholderRenderer::defaultBlankSpan(),
  69. false,
  70. false
  71. );
  72. $this->assertStringContainsString('</span>度', $rendered);
  73. $this->assertStringNotContainsString('</span>$度', $rendered);
  74. }
  75. public function test_choice_stem_trailing_left_quad_right_becomes_blank_line(): void
  76. {
  77. // questions.id=30949:段末 $=\left(\quad\right)$ 意图为答题横线,转为段外下划线再渲染为标准空位。
  78. $stem = '在三角形$ABC$中,$AC=3,AB=4,\angle CAB=120^{\circ}$,则$\left(\overrightarrow{AB}+\overrightarrow{AC}\right)\cdot\overrightarrow{AB}=\left(\quad\right)$';
  79. [$rendered] = BlankPlaceholderRenderer::replaceToBlankSpan(
  80. $stem,
  81. BlankPlaceholderRenderer::defaultBlankSpan(),
  82. false,
  83. false
  84. );
  85. $this->assertStringContainsString('border-bottom:1.2px dashed', $rendered);
  86. $this->assertStringContainsString('min-width:80px', $rendered);
  87. $this->assertStringNotContainsString('\\left(\\quad\\right)', $rendered);
  88. $this->assertStringNotContainsString('TOKEN', $rendered);
  89. $this->assertStringContainsString('\\overrightarrow{AB}', $rendered);
  90. }
  91. }