mediawiki-extensions-Math/tests/phpunit/unit/WikiTexVC/MMLmappings/BaseParsingTest.php
Moritz Schubotz (physikerwelt) f534146597
Implement hline support for matrix
In MathML outer table boarders are represented with the
notation attribute of an menclose element. The inner
boarders are represented by the rowlines attribute
of the mtable element. The rowline element accepts
a space seperated list of row boarders. In LaTeX
the bottom line is represented by a new matrix row
that only contains \hline.

This change discover \hline elements in matrix cells
and then determines if it is in the first or last line.
When it is in the last line, the line is removed to avoid
an empty <mtr /> in the output.

Bug: T366417
Change-Id: I196e0d14a183a63696363f9e3006cf65571dc56c
2024-06-03 19:15:43 +02:00

160 lines
5 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 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 );
}
}