mediawiki-extensions-Math/tests/phpunit/unit/WikiTexVC/MMLmappings/BaseParsingTest.php
physikerwelt 9a27d92c09 Add missing apply after operatorname
* Reapply the logic of \log rendering to \operatorname
* Deduplicate applyFunctionDetection

Note this still does not solve the rendering problem for
operator names with more than one letter as these generate
mrow elements with single letters. Those are not rendered
with space in FF.

Bug: T375861
Change-Id: I913d865b49d5894a63c8b9d244768f9bb1df4e28
2024-10-14 16:01:56 +00:00

201 lines
6.3 KiB
PHP

<?php
namespace MediaWiki\Extension\Math\Tests\WikiTexVC\MMLmappings;
use MediaWiki\Extension\Math\WikiTexVC\MMLmappings\BaseParsing;
use MediaWiki\Extension\Math\WikiTexVC\Nodes\DQ;
use MediaWiki\Extension\Math\WikiTexVC\Nodes\Fun1;
use MediaWiki\Extension\Math\WikiTexVC\Nodes\Literal;
use MediaWiki\Extension\Math\WikiTexVC\Nodes\Matrix;
use MediaWiki\Extension\Math\WikiTexVC\Nodes\TexArray;
use MediaWiki\Extension\Math\WikiTexVC\TexVC;
use PHPUnit\Framework\TestCase;
/**
* @covers \MediaWiki\Extension\Math\WikiTexVC\MMLmappings\BaseParsing
*/
class BaseParsingTest extends TestCase {
public function testAccent() {
$node = new Fun1(
'\\widetilde',
( new Literal( 'a' ) )
);
$result = BaseParsing::accent( $node, [], null, 'widetilde', '007E' );
$this->assertStringContainsString( '~', $result );
$this->assertStringContainsString( 'mover', $result );
}
public function testAccentArgPassing() {
$node = new Fun1(
'\\widetilde',
( new Literal( 'a' ) )
);
$result = BaseParsing::accent( $node, [ 'k' => 'v' ], null, 'widetilde', '007E' );
$this->assertStringContainsString( '<mi k="v"', $result );
}
public function testArray() {
$node = new Matrix( 'matrix',
new TexArray( new TexArray( new Literal( 'a' ) ) ) );
$result = BaseParsing::array( $node, [], null, 'array', '007E' );
$this->assertStringContainsString( '<mi>a</mi>', $result );
}
public function testBoldGreek() {
$node = new Fun1(
'\\boldsymbol',
( new Literal( '\\alpha' ) )
);
$result = BaseParsing::boldsymbol( $node, [], null, 'boldsymbol' );
$this->assertStringContainsString( 'mathvariant="bold-italic"', $result );
}
public function testBoldSymbol() {
$node = new Fun1(
'\\boldsymbol',
( new Literal( 'a' ) )
);
$result = BaseParsing::boldsymbol( $node, [], null, 'boldsymbol' );
$this->assertStringContainsString( 'mathvariant="bold-italic"', $result );
}
public function testCancel() {
$node = new Fun1(
'\\cancel',
( new Literal( 'a' ) )
);
$result = BaseParsing::cancel( $node, [], null, 'cancel', 'something' );
$this->assertStringContainsString( '<menclose notation="something"><mi>a</mi></menclose>',
$result );
}
public function testUnderOver() {
$node = new Fun1(
'\\overline',
( new Literal( 'a' ) )
);
$result = BaseParsing::underover( $node, [], null, 'oXXX', '00AF' );
$this->assertStringStartsWith( '<mrow', $result );
$this->assertStringContainsString( 'mover', $result );
}
public function testUnderOverUnder() {
$node = new Fun1(
'\\overline',
( new Literal( 'a' ) )
);
$result = BaseParsing::underover( $node, [], null, 'uXXX', '00AF' );
$this->assertStringContainsString( 'munder', $result );
}
public function testUnderOverDqUnder() {
$node = new DQ(
( new Literal( 'a' ) ),
( new Literal( 'b' ) )
);
$result = BaseParsing::underover( $node, [], null, 'uXXX', '00AF' );
$this->assertStringContainsString( 'munder', $result );
$this->assertStringContainsString( 'mrow', $result );
}
public function testUnderArgPassing() {
$node = new Fun1(
'\\overline',
( new Literal( 'a' ) )
);
$result = BaseParsing::underover( $node, [ 'k' => 'v' ], null, 'oXXX', '00AF' );
$this->assertStringContainsString( '<mi k="v"', $result );
}
public function testUnderBadArgPassing() {
$node = new Fun1(
'\\overline',
( new Literal( 'a' ) )
);
$result = BaseParsing::underover( $node,
[ 'k' => '"<script>alert("problem")</script>"' ], null, 'oXXX', '00AF' );
$this->assertStringContainsString( 'k="&quot;&lt;script&gt;alert(&quot;problem&quot;)', $result );
}
public function testAlignAt() {
$matrix = new Matrix( 'alignat',
new TexArray( new TexArray( new Literal( '\\sin' ) ) ) );
$result = BaseParsing::alignAt( $matrix, [], null, 'alignat', '002A' );
$this->assertStringContainsString( 'mtable', $result );
}
public function testHLineTop() {
$matrix = new Matrix( 'matrix',
new TexArray( new TexArray( new TexArray( new Literal( '\\hline ' ), new Literal( 'a'
) ) ) ) );
$result = BaseParsing::matrix( $matrix, [], null, 'matrix', '002A' );
$this->assertStringContainsString( 'top', $result );
}
public function testHLineBottom() {
$matrix = new Matrix( 'matrix',
new TexArray( new TexArray( new Literal( 'a' ) ),
new TexArray( new TexArray( new Literal( '\\hline ' ) ) ) ) );
$result = BaseParsing::matrix( $matrix, [], null, 'matrix', '002A' );
$this->assertStringContainsString( 'bottom', $result );
$this->assertStringContainsString( '<mi>a</mi>', $result );
}
public function testHLineLastLine() {
$matrix = new Matrix( 'matrix',
new TexArray( new TexArray( new Literal( 'a' ) ),
new TexArray( new TexArray( new Literal( '\\hline ' ), new Literal( 'a'
) ) ) ) );
$result = BaseParsing::matrix( $matrix, [], null, 'matrix', '002A' );
$this->assertStringContainsString( 'solid', $result );
$this->assertStringContainsString( '<mi>a</mi>', $result );
}
public function testComplicatedHline() {
$matrix = ( new TexVC() )->parse( '\\begin{array}{c}
\\hline a\\\\
\\hline 1\\\\
2\\\\
\\hline
\\end{array}' )[0];
$result = BaseParsing::matrix( $matrix, [], null, 'matrix', '002A' );
$this->assertStringContainsString( 'solid none', $result );
$this->assertStringContainsString( 'top bottom', $result );
}
public function testHandleOperatorName() {
$node = new Fun1(
'\\operatorname',
( new Literal( 'sn' ) )
);
$result = BaseParsing::handleOperatorName( $node, [], [
"foundNamedFct" => [ true, true ]
], 'operatorname' );
$this->assertStringContainsString( 'sn</mi>', $result );
$this->assertStringContainsString( '<mo>&#x2061;</mo>', $result );
}
public function testHandleOperatorLast() {
$node = new Fun1(
'\\operatorname',
( new Literal( 'sn' ) )
);
$result = BaseParsing::handleOperatorName( $node, [], [
"foundNamedFct" => [ true, false ]
], 'operatorname' );
$this->assertStringContainsString( 'sn</mi>', $result );
$this->assertStringNotContainsString( '<mo>&#x2061;</mo>', $result );
}
public function testColumnSpecs() {
$matrix = ( new TexVC() )->parse( '\\begin{array}{lcr}
z & = & a \\\\
f(x,y,z) & = & x + y + z
\\end{array}' )[0];
$result = BaseParsing::matrix( $matrix, [], null, 'matrix', '002A' );
$this->assertStringContainsString( 'left center right ', $result );
}
}