2015-11-26 19:31:09 +00:00
|
|
|
<?php
|
|
|
|
|
2021-04-07 22:22:05 +00:00
|
|
|
use MediaWiki\Extension\Math\MathRestbaseInterface;
|
2021-08-11 13:38:51 +00:00
|
|
|
use MediaWiki\Extension\Math\Tests\MathMockHttpTrait;
|
2021-04-07 22:22:05 +00:00
|
|
|
|
2015-11-26 19:31:09 +00:00
|
|
|
/**
|
|
|
|
* Test the interface to access Restbase paths
|
|
|
|
* /media/math/check/{type}
|
|
|
|
* /media/math/render/{format}/{hash}
|
|
|
|
*
|
2021-04-07 22:22:05 +00:00
|
|
|
* @covers \MediaWiki\Extension\Math\MathRestbaseInterface
|
2016-02-12 16:57:37 +00:00
|
|
|
*
|
2015-11-26 19:31:09 +00:00
|
|
|
* @group Math
|
2016-02-12 16:57:37 +00:00
|
|
|
*
|
2018-04-13 14:06:39 +00:00
|
|
|
* @license GPL-2.0-or-later
|
2015-11-26 19:31:09 +00:00
|
|
|
*/
|
2021-10-11 22:51:10 +00:00
|
|
|
class MathRestbaseInterfaceTest extends MediaWikiIntegrationTestCase {
|
2021-08-11 13:38:51 +00:00
|
|
|
use MathMockHttpTrait;
|
2015-11-26 19:31:09 +00:00
|
|
|
|
|
|
|
public function testSuccess() {
|
2021-08-11 13:38:51 +00:00
|
|
|
$this->setupGoodMathRestBaseMockHttp();
|
|
|
|
|
2015-11-26 19:31:09 +00:00
|
|
|
$input = '\\sin x^2';
|
|
|
|
$rbi = new MathRestbaseInterface( $input );
|
|
|
|
$this->assertTrue( $rbi->getSuccess(), "Assuming that $input is valid input." );
|
|
|
|
$this->assertEquals( '\\sin x^{2}', $rbi->getCheckedTex() );
|
2020-04-05 11:38:45 +00:00
|
|
|
$this->assertStringContainsString( '<mi>sin</mi>', $rbi->getMathML() );
|
2021-08-11 13:38:51 +00:00
|
|
|
$this->assertStringContainsString( '/svg/RESOURCE_LOCATION', $rbi->getFullSvgUrl() );
|
|
|
|
$this->assertStringContainsString( '/png/RESOURCE_LOCATION', $rbi->getFullPngUrl() );
|
2015-11-26 19:31:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public function testFail() {
|
2021-08-11 13:38:51 +00:00
|
|
|
$this->setupBadMathRestBaseMockHttp();
|
|
|
|
|
2015-11-26 19:31:09 +00:00
|
|
|
$input = '\\sin\\newcommand';
|
|
|
|
$rbi = new MathRestbaseInterface( $input );
|
|
|
|
$this->assertFalse( $rbi->getSuccess(), "Assuming that $input is invalid input." );
|
2020-01-14 07:43:50 +00:00
|
|
|
$this->assertNull( $rbi->getCheckedTex() );
|
2015-11-26 19:31:09 +00:00
|
|
|
$this->assertEquals( 'Illegal TeX function', $rbi->getError()->error->message );
|
|
|
|
}
|
|
|
|
|
2016-01-29 13:05:54 +00:00
|
|
|
public function testChem() {
|
2021-08-11 13:38:51 +00:00
|
|
|
$this->setupGoodChemRestBaseMockHttp();
|
|
|
|
|
2016-01-29 13:05:54 +00:00
|
|
|
$input = '\ce{H2O}';
|
|
|
|
$rbi = new MathRestbaseInterface( $input, 'chem' );
|
|
|
|
$this->assertTrue( $rbi->checkTeX(), "Assuming that $input is valid input." );
|
|
|
|
$this->assertTrue( $rbi->getSuccess(), "Assuming that $input is valid input." );
|
|
|
|
$this->assertEquals( '{\ce {H2O}}', $rbi->getCheckedTex() );
|
2020-04-05 11:38:45 +00:00
|
|
|
$this->assertStringContainsString( '<msubsup>', $rbi->getMathML() );
|
|
|
|
$this->assertStringContainsString( '<mtext>H</mtext>', $rbi->getMathML() );
|
2016-01-29 13:05:54 +00:00
|
|
|
}
|
2019-07-14 13:30:32 +00:00
|
|
|
|
2015-11-26 19:31:09 +00:00
|
|
|
public function testException() {
|
2021-08-11 13:38:51 +00:00
|
|
|
$this->setupBadMathRestBaseMockHttp();
|
|
|
|
|
|
|
|
$input = '\\sin\\newcommand';
|
2015-11-26 19:31:09 +00:00
|
|
|
$rbi = new MathRestbaseInterface( $input );
|
2019-10-16 02:28:43 +00:00
|
|
|
$this->expectException( MWException::class );
|
|
|
|
$this->expectExceptionMessage( 'TeX input is invalid.' );
|
2015-11-26 19:31:09 +00:00
|
|
|
$rbi->getMathML();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testExceptionSvg() {
|
2021-08-11 13:38:51 +00:00
|
|
|
$this->setupBadMathRestBaseMockHttp();
|
|
|
|
|
|
|
|
$input = '\\sin\\newcommand';
|
2015-11-26 19:31:09 +00:00
|
|
|
$rbi = new MathRestbaseInterface( $input );
|
2019-10-16 02:28:43 +00:00
|
|
|
$this->expectException( MWException::class );
|
|
|
|
$this->expectExceptionMessage( 'TeX input is invalid.' );
|
2015-11-26 19:31:09 +00:00
|
|
|
$rbi->getFullSvgUrl();
|
|
|
|
}
|
|
|
|
|
2016-08-17 17:41:04 +00:00
|
|
|
/**
|
|
|
|
* Incorporate the "details" in the error message, if the check requests passes, but the
|
|
|
|
* mml/svg/complete endpoints returns an error
|
|
|
|
*/
|
|
|
|
public function testLateError() {
|
2018-05-04 02:00:55 +00:00
|
|
|
// phpcs:ignore Generic.Files.LineLength.TooLong
|
2016-08-17 17:41:04 +00:00
|
|
|
$input = '{"type":"https://mediawiki.org/wiki/HyperSwitch/errors/bad_request","title":"Bad Request","method":"POST","detail":["TeX parse error: Missing close brace"],"uri":"/complete"}';
|
2019-10-16 02:28:43 +00:00
|
|
|
$this->expectException( MWException::class );
|
|
|
|
$this->expectExceptionMessage( 'Cannot get mml. TeX parse error: Missing close brace' );
|
2016-08-17 17:41:04 +00:00
|
|
|
MathRestbaseInterface::throwContentError( 'mml', $input );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Incorporate the "details" in the error message, if the check requests passes, but the
|
|
|
|
* mml/svg/complete endpoints returns an error
|
|
|
|
*/
|
|
|
|
public function testLateErrorString() {
|
2018-05-04 02:00:55 +00:00
|
|
|
// phpcs:ignore Generic.Files.LineLength.TooLong
|
2016-08-17 17:41:04 +00:00
|
|
|
$input = '{"type":"https://mediawiki.org/wiki/HyperSwitch/errors/bad_request","title":"Bad Request","method":"POST","detail": "TeX parse error: Missing close brace","uri":"/complete"}';
|
2019-10-16 02:28:43 +00:00
|
|
|
$this->expectException( MWException::class );
|
|
|
|
$this->expectExceptionMessage( 'Cannot get mml. TeX parse error: Missing close brace' );
|
2016-08-17 17:41:04 +00:00
|
|
|
MathRestbaseInterface::throwContentError( 'mml', $input );
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testLateErrorNoDetail() {
|
|
|
|
$input = '';
|
2019-10-16 02:28:43 +00:00
|
|
|
$this->expectException( MWException::class );
|
|
|
|
$this->expectExceptionMessage( 'Cannot get mml. Server problem.' );
|
2016-08-17 17:41:04 +00:00
|
|
|
MathRestbaseInterface::throwContentError( 'mml', $input );
|
|
|
|
}
|
2015-11-26 19:31:09 +00:00
|
|
|
}
|