mediawiki-extensions-Math/tests/phpunit/unit/WikiTexVC/Nodes/MatrixTest.php
Moritz Schubotz (physikerwelt) 5fa3d6bfe5 Clean matrix arguments
Originally the parse tree was a binary tree, from that
time matrix element were put into that data structure.
This was partially undone, but not full which leads to some artifacts
in matrix cells.

One of the problem is that due to the binary parse
tree structure the postprocessing did not correctly
identfy \limits.

This change changes reduces nesting from matrix, and regards
matrix instances as two-dimensional TexArrays.

Bug: T362344
Change-Id: I66a31a09f204709a51d6b5c9ecefc083f7ee2d6d
2024-06-03 09:25:15 +00:00

104 lines
3.1 KiB
PHP

<?php
namespace MediaWiki\Extension\Math\Tests\WikiTexVC\Nodes;
use ArgumentCountError;
use InvalidArgumentException;
use MediaWiki\Extension\Math\WikiTexVC\Nodes\Literal;
use MediaWiki\Extension\Math\WikiTexVC\Nodes\Matrix;
use MediaWiki\Extension\Math\WikiTexVC\Nodes\TexArray;
use MediaWikiUnitTestCase;
use TypeError;
/**
* @covers \MediaWiki\Extension\Math\WikiTexVC\Nodes\Matrix
*/
class MatrixTest extends MediaWikiUnitTestCase {
private $sampleMatrix;
protected function setUp(): void {
parent::setUp();
$this->sampleMatrix = new Matrix( 'align',
new TexArray( new TexArray( new Literal( 'a' ) ) ) );
}
public function testEmptyMatrix() {
$this->expectException( ArgumentCountError::class );
new Matrix();
throw new TypeError( 'Should not create an empty matrix' );
}
public function testNestedArguments() {
$this->expectException( InvalidArgumentException::class );
new Matrix(
'align',
new TexArray(
new Literal( 'a' ) ) );
throw new TypeError( 'Nested arguments have to be type of TexArray' );
}
public function testInstanceOfTexArray() {
$this->assertEquals( 'MediaWiki\\Extension\\Math\\WikiTexVC\\Nodes\\TexArray',
get_parent_class( $this->sampleMatrix ),
'Should create an instance of TexArray' );
}
public function testGetters() {
$this->assertNotEmpty( $this->sampleMatrix->getTop() );
$this->assertNotEmpty( $this->sampleMatrix->getMainarg() );
}
public function testRenderMatrix() {
$this->assertEquals( '{\\begin{align}a\\end{align}}', $this->sampleMatrix->render() );
}
public function testExtractCurlies() {
$this->assertEquals( '{\\begin{align}a\\end{align}}', $this->sampleMatrix->inCurlies(),
'Should not create extra curlies' );
}
public function testExtractIdentifiers() {
$this->assertEquals( [ 'a' ], $this->sampleMatrix->extractIdentifiers(),
'Should extract identifiers' );
}
public function testCreateFromMatrix() {
$matrix = new Matrix( 'align',
new TexArray( new TexArray( new Literal( 'a' ) ) ) );
$newMatrix = new Matrix( 'align', $matrix );
$this->assertEquals( $matrix, $newMatrix,
'Should create a matrix from a matrix' );
}
public function testContainsTop() {
$matrix = new Matrix( 'top',
new TexArray( new TexArray( new Literal( 'a' ) ) ) );
$this->assertTrue( $matrix->containsFunc( '\\begin{top}' ),
'Should create top attribute' );
}
public function testContainsArgs() {
$matrix = new Matrix( 'top',
new TexArray( new TexArray( new Literal( '\\sin' ) ) ) );
$this->assertTrue( $matrix->containsFunc( '\\sin' ),
'Should contain inner elements' );
}
public function testRenderMML() {
$matrix = new Matrix( 'matrix',
new TexArray( new TexArray( new Literal( '\\sin' ) ) ) );
$this->assertStringContainsString( 'mtable', $matrix->renderMML(),
'Should render a matrix' );
}
public function testTop() {
$this->sampleMatrix->setTop( 'abc' );
$this->assertEquals( 'abc', $this->sampleMatrix->getTop() );
}
public function testColSpec() {
$this->sampleMatrix->setColumnSpecs( TexArray::newCurly( new Literal( '2' ) ) );
$this->assertEquals( '{2}', $this->sampleMatrix->getColumnSpecs()->render() );
}
}