summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/tests/phpunit/MessageIndexTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/tests/phpunit/MessageIndexTest.php')
-rw-r--r--www/wiki/extensions/Translate/tests/phpunit/MessageIndexTest.php211
1 files changed, 211 insertions, 0 deletions
diff --git a/www/wiki/extensions/Translate/tests/phpunit/MessageIndexTest.php b/www/wiki/extensions/Translate/tests/phpunit/MessageIndexTest.php
new file mode 100644
index 00000000..6d61f4be
--- /dev/null
+++ b/www/wiki/extensions/Translate/tests/phpunit/MessageIndexTest.php
@@ -0,0 +1,211 @@
+<?php
+/**
+ * Tests for different MessageIndex backends.
+ *
+ * @file
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ */
+
+/**
+ * @group Database
+ * @group large
+ */
+class MessageIndexTest extends MediaWikiTestCase {
+ protected function setUp() {
+ parent::setUp();
+ $this->setMwGlobals( [
+ 'wgTranslateCacheDirectory' => $this->getNewTempDirectory(),
+ 'wgTranslateTranslationServices' => [],
+ ] );
+ }
+
+ /**
+ * @dataProvider provideTestGetArrayDiff
+ */
+ public function testGetArrayDiff( $expected, $old, $new ) {
+ $actual = MessageIndex::getArrayDiff( $old, $new );
+ $this->assertEquals( $expected['keys'], $actual['keys'], 'key diff' );
+ $this->assertEquals( $expected['values'], $actual['values'], 'value diff' );
+ }
+
+ public function provideTestGetArrayDiff() {
+ $tests = [];
+
+ // Addition
+ $old = [];
+ $new = [
+ 'label' => 'carpet',
+ ];
+ $expected = [
+ 'keys' => [
+ 'add' => [
+ 'label' => [
+ [],
+ [ 'carpet' ],
+ ],
+ ],
+ 'del' => [],
+ 'mod' => [],
+ ],
+ 'values' => [ 'carpet' ],
+ ];
+ $tests[] = [ $expected, $old, $new ];
+
+ // Deletion
+ $old = [
+ 'bath' => [ 'goal', 'morals', 'coronation' ],
+ ];
+ $new = [];
+ $expected = [
+ 'keys' => [
+ 'add' => [],
+ 'del' => [
+ 'bath' => [
+ [ 'goal', 'morals', 'coronation' ],
+ [],
+ ],
+ ],
+ 'mod' => [],
+ ],
+ 'values' => [ 'goal', 'morals', 'coronation' ],
+ ];
+ $tests[] = [ $expected, $old, $new ];
+
+ // No change
+ $old = $new = [
+ 'label' => 'carpet',
+ 'salt' => [ 'morals' ],
+ 'bath' => [ 'goal', 'morals', 'coronation' ],
+ ];
+ $expected = [
+ 'keys' => [
+ 'add' => [],
+ 'del' => [],
+ 'mod' => [],
+ ],
+ 'values' => [],
+ ];
+ $tests[] = [ $expected, $old, $new ];
+
+ // Modification
+ $old = [
+ 'bath' => [ 'goal', 'morals', 'coronation' ],
+ ];
+ $new = [
+ 'bath' => [ 'goal', 'beliefs', 'coronation', 'showcase' ],
+ ];
+ $expected = [
+ 'keys' => [
+ 'add' => [],
+ 'del' => [],
+ 'mod' => [
+ 'bath' => [
+ [ 'goal', 'morals', 'coronation' ],
+ [ 'goal', 'beliefs', 'coronation', 'showcase' ],
+ ],
+ ],
+ ],
+ 'values' => [ 'morals', 'beliefs', 'showcase' ],
+ ];
+ $tests[] = [ $expected, $old, $new ];
+
+ return $tests;
+ }
+
+ protected static function getTestData() {
+ static $data = null;
+ if ( $data === null ) {
+ $data = unserialize( file_get_contents( __DIR__ . '/messageindexdata.ser' ) );
+ }
+
+ return $data;
+ }
+
+ /**
+ * @dataProvider provideMessageIndexImplementation
+ */
+ public function testMessageIndexImplementation( $mi ) {
+ $data = self::getTestData();
+ /** @var TestableDatabaseMessageIndex|TestableCDBMessageIndex|TestableSerializedMessageIndex */
+ $diff = MessageIndex::getArrayDiff( [], $data );
+ $mi->store( $data, $diff['keys'] );
+
+ $tests = array_rand( $data, 10 );
+ foreach ( $tests as $key ) {
+ $this->assertSame(
+ $data[$key],
+ $mi->get( $key ),
+ "Values are preserved for random key $key"
+ );
+ }
+
+ $cached = $mi->retrieve();
+
+ $tests = array_rand( $data, 10 );
+ foreach ( $tests as $key ) {
+ $this->assertSame(
+ $data[$key],
+ $mi->get( $key ),
+ "Values are preserved after retrieve for random key $key"
+ );
+ }
+
+ $this->assertEquals(
+ count( $data ),
+ count( $cached ),
+ 'Cache has same number of elements'
+ );
+ $this->assertEquals( $data, $cached, 'Cache is preserved' );
+ }
+
+ public static function provideMessageIndexImplementation() {
+ return [
+ [ new TestableDatabaseMessageIndex() ],
+ [ new TestableCDBMessageIndex() ],
+ [ new TestableSerializedMessageIndex() ],
+ [ new TestableHashMessageIndex() ],
+ // Not testing CachedMessageIndex because there is no easy way to mockup those.
+ ];
+ }
+}
+
+class TestableDatabaseMessageIndex extends DatabaseMessageIndex {
+ public function store( array $a, array $diff ) {
+ parent::store( $a, $diff );
+ }
+
+ public function get( $a ) {
+ return parent::get( $a );
+ }
+}
+
+class TestableCDBMessageIndex extends CDBMessageIndex {
+ public function store( array $a, array $diff ) {
+ parent::store( $a, $diff );
+ }
+
+ public function get( $a ) {
+ return parent::get( $a );
+ }
+}
+
+class TestableSerializedMessageIndex extends SerializedMessageIndex {
+ public function store( array $a, array $diff ) {
+ parent::store( $a, $diff );
+ }
+
+ public function get( $a ) {
+ return parent::get( $a );
+ }
+}
+
+class TestableHashMessageIndex extends HashMessageIndex {
+ public function store( array $a, array $diff ) {
+ parent::store( $a, $diff );
+ }
+
+ public function get( $a ) {
+ return parent::get( $a );
+ }
+}