Foxtrott has submitted this change and it was merged.

Change subject: Add simple integration test
......................................................................


Add simple integration test

Change-Id: I6579622bc46f89720b29199401343b07dcfde104
---
M docs/release-notes.md
M extension.json
M src/LingoParser.php
A tests/phpunit/Fixture/articleAnnotation/simple.xml
A tests/phpunit/Integration/ArticleAnnotationTest.php
A tests/phpunit/Util/XmlFileProvider.php
6 files changed, 274 insertions(+), 8 deletions(-)

Approvals:
  Foxtrott: Verified; Looks good to me, approved



diff --git a/docs/release-notes.md b/docs/release-notes.md
index 1fe7436..cd9bf44 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -1,5 +1,12 @@
 ## Release Notes
 
+### Lingo 2.0.1
+
+Released on tbd
+
+Changes:
+* Improved test coverage
+
 ### Lingo 2.0.0
 
 Released on 09-Mar-2016
@@ -27,7 +34,7 @@
 * Migrate to JSON i18n
 * Remove wfMsg / wfMsgForContent usage
 * Unstrip strip items of 'general' category
-* Swap SpecialVersionExtensionTypes for ExtensionTypes
+* Use ExtensionFunctions instead of SpecialVersionExtensionTypes
 
 ### Lingo 1.1.0
 
diff --git a/extension.json b/extension.json
index c54831a..33109d2 100644
--- a/extension.json
+++ b/extension.json
@@ -1,6 +1,6 @@
 {
        "name": "Lingo",
-       "version": "2.0.0",
+       "version": "2.0.1-dev",
        "author": [
                "Barry Coughlan",
                "[http://www.mediawiki.org/wiki/User:F.trott Stephan Gambke]",
@@ -66,7 +66,8 @@
                "Lingo\\Element": "/src/Element.php",
                "Lingo\\Backend": "/src/Backend.php",
                "Lingo\\BasicBackend": "/src/BasicBackend.php",
-               "Lingo\\MessageLog": "/src/MessageLog.php"
+               "Lingo\\MessageLog": "/src/MessageLog.php",
+               "Lingo\\Tests\\Util\\XmlFileProvider": 
"/tests/phpunit/Util/XmlFileProvider.php"
        },
        "Hooks": {
                "ParserFirstCallInit": [
diff --git a/src/LingoParser.php b/src/LingoParser.php
index 684ed34..524e4e1 100644
--- a/src/LingoParser.php
+++ b/src/LingoParser.php
@@ -60,7 +60,7 @@
        public function __construct( MessageLog &$messages = null ) {
                global $wgexLingoBackend;
 
-               $this->mLingoBackend = new $wgexLingoBackend( $messages );
+               $this->setBackend( new $wgexLingoBackend( $messages ) );
        }
 
        /**
@@ -71,6 +71,16 @@
         */
        public static function parse( Parser &$parser, &$text ) {
 
+               self::getInstance()->realParse( $parser, $text );
+
+               return true;
+       }
+
+       /**
+        * @return LingoParser
+        * @since 2.0.1
+        */
+       public static function getInstance() {
                if ( !self::$parserSingleton ) {
                        self::$parserSingleton = new LingoParser();
 
@@ -79,9 +89,7 @@
                        self::$regex = '/' . preg_quote( Parser::MARKER_PREFIX, 
'/' ) . '.*?' . preg_quote( Parser::MARKER_SUFFIX, '/' ) . 
'|[\p{L}\p{N}]+|[^\p{L}\p{N}]/u';
                }
 
-               self::$parserSingleton->realParse( $parser, $text );
-
-               return true;
+               return self::$parserSingleton;
        }
 
        /**
@@ -297,7 +305,7 @@
        }
 
        /**
-        * @param $parser
+        * @param Parser $parser
         */
        protected function loadModules( &$parser ) {
                global $wgOut, $wgScriptPath;
@@ -346,5 +354,13 @@
                $cache->delete( wfMemcKey( 'ext', 'lingo', 'lingotree' ) );
 
        }
+
+       /**
+        * @since 2.0.1
+        * @param Backend $backend
+        */
+       public function setBackend( $backend ) {
+               $this->mLingoBackend = $backend;
+       }
 }
 
diff --git a/tests/phpunit/Fixture/articleAnnotation/simple.xml 
b/tests/phpunit/Fixture/articleAnnotation/simple.xml
new file mode 100644
index 0000000..d66b9a0
--- /dev/null
+++ b/tests/phpunit/Fixture/articleAnnotation/simple.xml
@@ -0,0 +1,20 @@
+<testcase>
+       <text>
+<![CDATA[
+foo
+]]>
+       </text>
+       <expected>
+<![CDATA[
+<span class="mw-lingo-tooltip "><span 
class="mw-lingo-tooltip-abbr">foo</span><span class="mw-lingo-tooltip-tip 
"><span class="mw-lingo-tooltip-definition ">bar</span></span></span>
+]]>
+       </expected>
+       <glossary-entry>
+               <term>foo</term>
+               <definition>bar</definition>
+       </glossary-entry>
+       <glossary-entry>
+               <term>baz</term>
+               <definition>quok</definition>
+       </glossary-entry>
+</testcase>
diff --git a/tests/phpunit/Integration/ArticleAnnotationTest.php 
b/tests/phpunit/Integration/ArticleAnnotationTest.php
new file mode 100644
index 0000000..b600996
--- /dev/null
+++ b/tests/phpunit/Integration/ArticleAnnotationTest.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ * This file is part of the MediaWiki extension Lingo.
+ *
+ * @copyright 2011 - 2016, Stephan Gambke
+ * @license   GNU General Public License, version 2 (or any later version)
+ *
+ * The Lingo extension is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the 
Free
+ * Software Foundation; either version 2 of the License, or (at your option) 
any
+ * later version.
+ *
+ * The Lingo extension is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 
more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @since 2.0.1
+ * @file
+ * @ingroup Lingo
+ */
+
+namespace Lingo\Tests\Integration;
+
+use Lingo\LingoParser;
+use Lingo\Tests\Util\XmlFileProvider;
+
+use Parser;
+use ParserOptions;
+
+use PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls;
+use ReflectionClass;
+
+/**
+ * @group extensions-lingo
+ * @group extensions-lingo-integration
+ * @group mediawiki-databaseless
+ *
+ * @coversNothing
+ *
+ * @ingroup Lingo
+ * @ingroup Test
+ * @since 2.0.1
+ * @author Stephan Gambke
+ */
+class ArticleAnnotationTest extends \PHPUnit_Framework_TestCase {
+
+       public function setup() {
+       }
+
+       public function tearDown() {
+               // reset LingoParser singleton
+               $lingoParser = LingoParser::getInstance();
+               $reflection = new ReflectionClass( $lingoParser );
+               $instance = $reflection->getProperty( 'parserSingleton' );
+               $instance->setAccessible( true );
+               $instance->setValue( null, null );
+               $instance->setAccessible( false );
+       }
+
+       /**
+        * @dataProvider provideData
+        * @param $text
+        * @param $glossaryEntries
+        * @param $expected
+        */
+       public function testArticleAnnotation( $file = null, $text = '', 
$glossaryEntries = null, $expected = '' ) {
+
+               $parser = new Parser();
+               $parser->startExternalParse(
+                       /* Title         */     null,
+                       /* ParserOptions */     ParserOptions::newFromAnon(),
+                       /* $outputType = */     Parser::OT_HTML,
+                       /* $clearState = */     true
+               );
+
+               $backend = $this->getMockForAbstractClass( '\Lingo\Backend' );
+               $backend->expects( $this->any() )
+                       ->method( 'next' )
+                       ->will( new 
PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls( $glossaryEntries ) );
+
+
+               $lingoParser = LingoParser::getInstance();
+               $lingoParser->setBackend( $backend );
+
+               LingoParser::parse( $parser, $text );
+
+               $this->assertEquals( $expected, $text );
+
+
+       }
+
+       public function provideData() {
+
+               $data = array();
+
+               $xmlFileProvider = new XmlFileProvider( __DIR__ . 
'/../Fixture/articleAnnotation' );
+               $files = $xmlFileProvider->getFiles();
+
+               foreach ( $files as $file ) {
+
+                       $xml = simplexml_load_file( $file, "SimpleXMLElement", 
LIBXML_NOCDATA );
+                       $json = json_encode( $xml );
+                       $decoded = json_decode( $json, TRUE );
+
+                       \MediaWiki\suppressWarnings();
+                       $testCase = array(
+                               0 => substr( $file, strlen( __DIR__ . 
'/../Fixture/articleAnnotation' ) ),
+                               1 => $decoded[ 'text' ],
+                               2 => array(),
+                               3 => $decoded[ 'expected' ],
+                       );
+
+                       if ( array_key_exists( 'term', $decoded[ 
'glossary-entry' ] ) ) {
+
+                               $testCase[ 2 ][] = array( $decoded[ 
'glossary-entry' ][ 'term' ], $decoded[ 'glossary-entry' ][ 'definition' ], 
$decoded[ 'glossary-entry' ][ 'link' ], $decoded[ 'glossary-entry' ][ 'style' ] 
);
+
+                       } else {
+                               foreach ( $decoded[ 'glossary-entry' ] as 
$entry ) {
+                                       $testCase[ 2 ][] = array( $entry[ 
'term' ], $entry[ 'definition' ], $entry[ 'link' ], $entry[ 'style' ] );
+                               }
+                       }
+                       \MediaWiki\restoreWarnings();
+
+                       $data[] = $testCase;
+               }
+
+               return $data;
+       }
+}
diff --git a/tests/phpunit/Util/XmlFileProvider.php 
b/tests/phpunit/Util/XmlFileProvider.php
new file mode 100644
index 0000000..b3b4000
--- /dev/null
+++ b/tests/phpunit/Util/XmlFileProvider.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ *
+ * @copyright 2011 - 2016, Stephan Gambke, mwjames
+ *
+ * @license   GNU General Public License, version 2 (or any later version)
+ *
+ * This file is part of the MediaWiki extension Lingo.
+ * The Lingo extension is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the 
Free
+ * Software Foundation; either version 2 of the License, or (at your option) 
any
+ * later version.
+ *
+ * The Lingo extension is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 
more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @since 2.0.1
+ * @file
+ * @ingroup Lingo
+ * @ingroup Test
+ */
+
+namespace Lingo\Tests\Util;
+
+use RuntimeException;
+
+/**
+ * @group extensions-lingo
+ * @group mediawiki-databaseless
+ *
+ * @since 2.0.1
+ * @author mwjames, Stephan Gambke
+ * @ingroup Lingo
+ * @ingroup Test
+ */
+class XmlFileProvider {
+
+       protected $path = null;
+
+       /**
+        * @param string $path
+        */
+       public function __construct( $path ) {
+               $this->path = $path;
+       }
+
+       /**
+        * @return string[]
+        */
+       public function getFiles() {
+               return $this->loadXmlFiles( $this->readDirectory( $this->path ) 
);
+       }
+
+       /**
+        * @param String $path
+        * @return string
+        */
+       protected function readDirectory( $path ) {
+
+               $path = str_replace( array( '\\', '/' ), DIRECTORY_SEPARATOR, 
$path );
+
+               if ( is_readable( $path ) ) {
+                       return $path;
+               }
+
+               throw new RuntimeException( "Expected an accessible {$path} 
path" );
+       }
+
+       /**
+        * @param String $path
+        * @return string[]
+        */
+       protected function loadXmlFiles( $path ) {
+
+               $directoryIterator = new \RecursiveDirectoryIterator( $path );
+               $iteratorIterator = new 
\RecursiveIteratorIterator($directoryIterator);
+               $regexIterator = new \RegexIterator($iteratorIterator, 
'/^.+\.xml$/i', \RecursiveRegexIterator::GET_MATCH);
+
+               $files = call_user_func_array('array_merge', iterator_to_array( 
$regexIterator ) );
+
+               return $files;
+       }
+
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/276979
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I6579622bc46f89720b29199401343b07dcfde104
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/Lingo
Gerrit-Branch: master
Gerrit-Owner: Foxtrott <s7ep...@gmail.com>
Gerrit-Reviewer: Foxtrott <s7ep...@gmail.com>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to