diff --git a/src/MathMathML.php b/src/MathMathML.php
index 9cae460..904c164 100644
--- a/src/MathMathML.php
+++ b/src/MathMathML.php
@@ -38,13 +38,12 @@ class MathMathML extends MathRenderer {
$this->setMode( 'mathml' );
$this->hosts = $wgMathMathMLUrl;
if ( isset( $params['type'] ) ) {
+ $allowedTypes = [ 'pmml', 'ascii', 'chem' ];
+ if ( in_array( $params['type'], $allowedTypes ) ) {
+ $this->inputType = $params['type'];
+ }
if ( $params['type'] == 'pmml' ) {
- $this->inputType = 'pmml';
$this->setMathml( '' );
- } elseif ( $params['type'] == 'ascii' ) {
- $this->inputType = 'ascii';
- } elseif ( $params['type'] == 'chem' ) {
- $this->inputType = 'chem';
}
}
if ( !isset( $params['display'] ) && $this->getMathStyle() == 'inlineDisplaystyle' ) {
@@ -194,7 +193,7 @@ class MathMathML extends MathRenderer {
$error = '';
$res = null;
if ( !$host ) {
- $host = self::pickHost();
+ $host = $this->pickHost();
}
if ( !$post ) {
$this->getPostData();
@@ -237,10 +236,11 @@ class MathMathML extends MathRenderer {
* If more than one demon is available, one is chosen at random.
*
* @return string
+ * @deprecated
*/
protected function pickHost() {
if ( is_array( $this->hosts ) ) {
- $host = array_rand( $this->hosts );
+ $host = $this->hosts[array_rand( $this->hosts )];
$this->hosts = $host; // Use the same host for this class instance
} else {
$host = $this->hosts;
@@ -278,7 +278,7 @@ class MathMathML extends MathRenderer {
return false;
}
$res = '';
- $host = self::pickHost();
+ $host = $this->pickHost();
$post = $this->getPostData();
$this->lastError = '';
$requestResult = $this->makeRequest( $host, $post, $res, $this->lastError );
@@ -337,15 +337,11 @@ class MathMathML extends MathRenderer {
} else {
$name = $xmlObject->getRootElement();
$elementSplit = explode( ':', $name );
- if ( is_array( $elementSplit ) ) {
- $localName = end( $elementSplit );
- } else {
- $localName = $name;
- }
+ $localName = end( $elementSplit );
if ( in_array( $localName, $this->getAllowedRootElements() ) ) {
$out = true;
} else {
- LoggerFactory::getInstance( 'Math' )->error( "Got wrong root element : $name" );
+ LoggerFactory::getInstance( 'Math' )->error( "Got wrong root element: $name" );
}
}
return $out;
diff --git a/tests/phpunit/MathMathMLTest.php b/tests/phpunit/MathMathMLTest.php
index 362ea7b..8423e52 100644
--- a/tests/phpunit/MathMathMLTest.php
+++ b/tests/phpunit/MathMathMLTest.php
@@ -32,10 +32,30 @@ class MathMathMLTest extends MediaWikiTestCase {
}
protected function setUp() {
- parent::setUp(); // TODO: Change the autogenerated stub
+ parent::setUp();
$this->setMwGlobals( 'wgMathoidCli', false );
}
+ /**@covers MathMathML::__constructor */
+ public function testMathMLConstructorWithPmml() {
+ $mml = new MathMathML( 'sin', [ 'type' => 'pmml' ] );
+ $this->assertEquals( 'pmml', $mml->getInputType() );
+ $this->assertEquals( '', $mml->getMathml() );
+ }
+
+ /**@covers MathMathML::__constructor */
+ public function testMathMLConstructorWithInvalidType() {
+ $mml = new MathMathML( 'sin', [ 'type' => 'invalid' ] );
+ $this->assertEquals( 'tex', $mml->getInputType() );
+ }
+
+ /**@covers MathMathML::__constructor */
+ public function testChangeRootElemts() {
+ $mml = new MathMathML( 'sin', [ 'type' => 'invalid' ] );
+ $mml->setAllowedRootElements( [ 'a','b' ] );
+ $this->assertEquals( [ 'a','b' ], $mml->getAllowedRootElements() );
+ }
+
/**
* Tests behavior of makeRequest() that communicates with the host.
* Testcase: Invalid request.
@@ -102,6 +122,38 @@ class MathMathMLTest extends MediaWikiTestCase {
$this->assertContains( $errmsg, $error, "timeout call errormessage" );
}
+ /**
+ * Tests behavior of makeRequest() that communicates with the host.
+ * Test case: Get PostData.
+ * @covers MathMathML::makeRequest
+ */
+ public function testMakeRequestGetPostData() {
+ self::setMockValues( false, true, true );
+ $url = 'http://example.com/timeout';
+ $renderer = $this->getMockBuilder( 'MathMathML' )
+ ->setMethods( [ 'getPostData' ] )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $renderer->expects( $this->once() )->method( 'getPostData' );
+ $renderer->makeRequest( $url, false, $res, $error, 'MathMLHttpRequestTester' );
+ }
+
+ /**
+ * Tests behavior of makeRequest() that communicates with the host.
+ * Test case: Get host.
+ * @covers MathMathML::pickHost
+ */
+ public function testMakeRequestGetHost() {
+ self::setMockValues( false, true, true );
+ $url = 'http://example.com/timeout';
+ $renderer = $this->getMockBuilder( 'MathMathML' )
+ ->setMethods( [ 'getPostData', 'pickHost' ] )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $renderer->expects( $this->once() )->method( 'pickHost' );
+ $renderer->makeRequest( false, false, $res, $error, 'MathMLHttpRequestTester' );
+ }
+
/**
* Checks if a String is a valid MathML element
* @covers MathMathML::isValidMathML
@@ -119,6 +171,22 @@ class MathMathMLTest extends MediaWikiTestCase {
'test if math expression is invalid mathml sample' );
}
+ /**
+ * @covers MathMathML::isValidMathML
+ */
+ public function testInvalidXml() {
+ $renderer = $this->getMockBuilder( 'MathMathML' )
+ ->setMethods( null )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $invalidSample = 'assertFalse( $renderer->isValidMathML( $invalidSample ),
+ 'test if math expression is invalid mathml sample' );
+ $renderer->setXMLValidation( false );
+ $this->assertTrue( $renderer->isValidMathML( $invalidSample ),
+ 'test if math expression is invalid mathml sample' );
+ }
+
public function testintegrationTestWithLinks() {
$p = new Parser();
$po = new ParserOptions();
@@ -141,6 +209,26 @@ class MathMathMLTest extends MediaWikiTestCase {
$m->setSvg( 'style=" vertical-align:-.505ex; \n" height="2.843ex" width="28.527ex"' );
$this->assertEquals( 'vertical-align:-.505ex; height: 2.843ex; width: 28.527ex;', $style );
}
+
+ public function testPickHost() {
+ $hosts = [ 'a', 'b', 'c' ];
+ $this->setMwGlobals( 'wgMathMathMLUrl', $hosts );
+ $class = new ReflectionClass( 'MathMathML' );
+ $method = $class->getMethod( 'pickHost' );
+ $method->setAccessible( true );
+ srand( 0 ); // Make array_rand always return the same elements
+ $h1 = $hosts[array_rand( $hosts )];
+ $h2 = $hosts[array_rand( $hosts )];
+ srand( 0 );
+ $m = new MathMathML();
+ $host1 = $method->invoke( $m, [] );
+ $this->assertEquals( $h1, $host1 );
+ $host2 = $method->invoke( $m, [] );
+ $this->assertEquals( $host1, $host2 );
+ $m2 = new MathMathML();
+ $host3 = $method->invoke( $m2, [] );
+ $this->assertEquals( $h2, $host3 );
+ }
}
/**