Aleksey Bekh-Ivanov (WMDE) has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/378029 )

Change subject: [DNM] Generate Lexeme with forms
......................................................................

[DNM] Generate Lexeme with forms

Change-Id: I8e5ca10ce400c92d95cfcdda10a5a9ca8f78f9a1
WARNING: There is a bug in the code patching grammatical features
---
M src/DataModel/Form.php
M src/DataModel/FormSet.php
M tests/phpunit/composer/DataModel/Services/Diff/LexemeDifferPatcherTest.php
A tests/phpunit/composer/ErisGenerators/FormGenerator.php
A tests/phpunit/composer/ErisGenerators/FormSetGenerator.php
M tests/phpunit/composer/ErisGenerators/LexemeGenerator.php
M tests/phpunit/composer/ErisGenerators/TermGenerator.php
M tests/phpunit/composer/ErisGenerators/TermListGenerator.php
8 files changed, 198 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseLexeme 
refs/changes/29/378029/1

diff --git a/src/DataModel/Form.php b/src/DataModel/Form.php
index 4b58842..6b2b57e 100644
--- a/src/DataModel/Form.php
+++ b/src/DataModel/Form.php
@@ -57,7 +57,7 @@
 
                $this->id = $id;
                $this->representations = $representations;
-               $this->grammaticalFeatures = $grammaticalFeatures;
+               $this->setGrammaticalFeatures( $grammaticalFeatures );
                $this->statementList = $statementList ?: new StatementList();
        }
 
@@ -83,6 +83,10 @@
        }
 
        public function setGrammaticalFeatures( array $grammaticalFeatures ) {
+               usort( $grammaticalFeatures, function ( ItemId $a, ItemId $b ) {
+                       return strcmp( $a->getSerialization(), 
$b->getSerialization() );
+               } );
+
                //TODO Add uniqueness check as soon as grammaticalFeatures is a 
set
                $this->grammaticalFeatures = $grammaticalFeatures;
        }
diff --git a/src/DataModel/FormSet.php b/src/DataModel/FormSet.php
index 6933dbc..36cedf3 100644
--- a/src/DataModel/FormSet.php
+++ b/src/DataModel/FormSet.php
@@ -32,7 +32,9 @@
         * @return Form[]
         */
        public function toArray() {
-               return array_values( $this->forms );
+               $forms = $this->forms;
+               ksort( $forms );
+               return array_values( $forms );
        }
 
        public function count() {
@@ -68,4 +70,15 @@
                unset( $this->forms[$formId->getSerialization()] );
        }
 
+       /**
+        * @param FormId $formId
+        *
+        * @return Form|null
+        */
+       public function getForm( FormId $formId ) {
+               return isset( $this->forms[$formId->getSerialization()] ) ?
+                       $this->forms[$formId->getSerialization()]
+                       : null;
+       }
+
 }
diff --git 
a/tests/phpunit/composer/DataModel/Services/Diff/LexemeDifferPatcherTest.php 
b/tests/phpunit/composer/DataModel/Services/Diff/LexemeDifferPatcherTest.php
index 5a8af91..d191f24 100644
--- a/tests/phpunit/composer/DataModel/Services/Diff/LexemeDifferPatcherTest.php
+++ b/tests/phpunit/composer/DataModel/Services/Diff/LexemeDifferPatcherTest.php
@@ -39,15 +39,43 @@
 
                $eris = new Facade();
 
+               $counter = 0;
                $eris->forAll(
                                WikibaseLexemeGenerators::lexeme( new LexemeId( 
'L1' ) ),
                                WikibaseLexemeGenerators::lexeme( new LexemeId( 
'L1' ) )
                        )
-                       ->then( function ( Lexeme $lexeme1, Lexeme $lexeme2 ) 
use ( $differ, $patcher ) {
+                       ->then( function ( Lexeme $lexeme1, Lexeme $lexeme2 ) 
use ( $differ, $patcher, &$counter ) {
+                               $counter++;
                                $patch = $differ->diffEntities( $lexeme1, 
$lexeme2 );
                                $patcher->patchEntity( $lexeme1, $patch );
 
-                               $this->assertTrue( $lexeme1->equals( $lexeme2 
), 'Lexemes are not equal' );
+                               $this->assertTrue(
+                                       $lexeme1->getLanguage()->equals( 
$lexeme2->getLanguage() ),
+                                       'Lexemes have different languages'
+                               );
+                               $this->assertTrue(
+                                       $lexeme1->getLexicalCategory()->equals( 
$lexeme2->getLexicalCategory() ),
+                                       'Lexemes have different lexical 
categories'
+                               );
+                               $this->assertTrue(
+                                       $lexeme1->getStatements()->equals( 
$lexeme2->getStatements() ),
+                                       'Lexemes have different statements'
+                               );
+                               $this->assertTrue(
+                                       $lexeme1->getLemmas()->equals( 
$lexeme2->getLemmas() ),
+                                       'Lexemes have different lemmas'
+                               );
+                               $this->assertEquals(
+                                       $lexeme2->getForms(),
+                                       $lexeme1->getForms(),
+                                       'Lexemes have different forms'
+                               );
+                               $this->assertGreaterThanOrEqual(
+                                       $lexeme2->getNextFormId(),
+                                       $lexeme1->getNextFormId()
+                               );
+
+//                             $this->assertTrue( $lexeme1->equals( $lexeme2 
), 'Lexemes are not equal' );
                        } );
        }
 
diff --git a/tests/phpunit/composer/ErisGenerators/FormGenerator.php 
b/tests/phpunit/composer/ErisGenerators/FormGenerator.php
new file mode 100644
index 0000000..85fea2e
--- /dev/null
+++ b/tests/phpunit/composer/ErisGenerators/FormGenerator.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Wikibase\Lexeme\Tests\ErisGenerators;
+
+use Eris\Generator;
+use Eris\Generator\GeneratedValueSingle;
+use Eris\Generator\MapGenerator;
+use Eris\Generator\SetGenerator;
+use Wikibase\Lexeme\DataModel\Form;
+use Wikibase\Lexeme\DataModel\FormId;
+
+class FormGenerator implements Generator {
+
+       const MAX_FORM_ID = 100;
+
+       /**
+        * @var TermListGenerator
+        */
+       private $representationGenerator;
+
+       /**
+        * @var SetGenerator
+        */
+       private $grammaticalFeaturesGenerator;
+
+       /**
+        * @var MapGenerator
+        */
+       private $formIdGenerator;
+
+       public function __construct() {
+               $this->representationGenerator = new TermListGenerator( 1 );
+               $this->grammaticalFeaturesGenerator = new SetGenerator( new 
ItemIdGenerator() );
+               $this->formIdGenerator = new MapGenerator(
+                       function ( $number ) {
+                               return new FormId( 'F' . $number );
+                       },
+                       new Generator\ChooseGenerator( 1, self::MAX_FORM_ID )
+               );
+       }
+
+       public function __invoke( $size, $rand ) {
+               $generateRepresentations = $this->representationGenerator;
+               $generateGrammaticalFeatures = 
$this->grammaticalFeaturesGenerator;
+               $generateFormId = $this->formIdGenerator;
+
+               $formId = $generateFormId( $size, $rand )->unbox();
+               $representations = $generateRepresentations( $size, $rand 
)->unbox();
+               $grammaticalFeatures = $generateGrammaticalFeatures( $size, 
$rand )->unbox();
+               $statementList = null;
+
+               $form = new Form( $formId, $representations, 
$grammaticalFeatures, $statementList );
+               return GeneratedValueSingle::fromJustValue( $form, 'form' );
+       }
+
+       public function shrink( GeneratedValueSingle $element ) {
+               return $element;
+       }
+
+}
diff --git a/tests/phpunit/composer/ErisGenerators/FormSetGenerator.php 
b/tests/phpunit/composer/ErisGenerators/FormSetGenerator.php
new file mode 100644
index 0000000..d34f1d5
--- /dev/null
+++ b/tests/phpunit/composer/ErisGenerators/FormSetGenerator.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Wikibase\Lexeme\Tests\ErisGenerators;
+
+use Eris\Generator;
+use Eris\Generator\GeneratedValueSingle;
+use Wikibase\Lexeme\DataModel\Form;
+use Wikibase\Lexeme\DataModel\FormSet;
+
+class FormSetGenerator implements Generator {
+
+       /**
+        * @var FormGenerator
+        */
+       private $formGenerator;
+
+       public function __construct() {
+               $this->formGenerator = new FormGenerator();
+       }
+
+       public function __invoke( $size, $rand ) {
+               $generateForm = $this->formGenerator;
+
+               $listSize = $rand( 0, $size );
+
+               $result = new FormSet( [] );
+
+               $trials = 0;
+               $maxTrials = 2 * $listSize;
+               while ( $result->count() < $listSize && $trials < $maxTrials ) {
+                       $trials++;
+                       /** @var Form $form */
+                       $form = $generateForm( $size, $rand )->unbox();
+                       if ( $result->getForm( $form->getId() ) ) {
+                               continue;
+                       }
+
+                       $result->add( $form );
+               }
+
+               return GeneratedValueSingle::fromJustValue( $result, 'FormSet' 
);
+       }
+
+       public function shrink( GeneratedValueSingle $element ) {
+               return $element;
+       }
+
+}
diff --git a/tests/phpunit/composer/ErisGenerators/LexemeGenerator.php 
b/tests/phpunit/composer/ErisGenerators/LexemeGenerator.php
index 91a8df8..eadc316 100644
--- a/tests/phpunit/composer/ErisGenerators/LexemeGenerator.php
+++ b/tests/phpunit/composer/ErisGenerators/LexemeGenerator.php
@@ -3,7 +3,10 @@
 namespace Wikibase\Lexeme\Tests\ErisGenerators;
 
 use Eris\Generator;
+use Eris\Generator\GeneratedValueOptions;
 use Eris\Generator\GeneratedValueSingle;
+use Wikibase\DataModel\Term\TermList;
+use Wikibase\Lexeme\DataModel\FormSet;
 use Wikibase\Lexeme\DataModel\Lexeme;
 use Wikibase\Lexeme\DataModel\LexemeId;
 
@@ -32,12 +35,18 @@
         */
        private $lemmaListGenerator;
 
+       /**
+        * @var FormSetGenerator
+        */
+       private $formSetGenerator;
+
        public function __construct( LexemeId $lexemeId ) {
                $this->lexemeId = $lexemeId;
 
                $this->languageGenerator = new ItemIdGenerator();
                $this->lexicalCategoryGenerator = new ItemIdGenerator();
                $this->lemmaListGenerator = new TermListGenerator();
+               $this->formSetGenerator = new FormSetGenerator();
        }
 
        /**
@@ -49,15 +58,34 @@
         * @return GeneratedValueSingle<T>
         */
        public function __invoke( $size, $rand ) {
+               static $counter = 0;
+               fwrite( STDERR, $counter++ . PHP_EOL );
+
+               $size = min( $size, 25 );
+
                $generateLanguage = $this->languageGenerator;
                $generateLexicalCategory = $this->lexicalCategoryGenerator;
                $generateLemmaList = $this->lemmaListGenerator;
+               $generateFormSet = $this->formSetGenerator;
 
                $language = $generateLanguage( $size, $rand )->unbox();
                $lexicalCategory = $generateLexicalCategory( $size, $rand 
)->unbox();
                $lemmas = $generateLemmaList( $size, $rand )->unbox();
 
-               $lexeme = new Lexeme( $this->lexemeId, $lemmas, 
$lexicalCategory, $language );
+               /** @var FormSet $formSet */
+               $formSet = $generateFormSet( $size, $rand )->unbox();
+               $counterIncrement = $rand( 1, 50 );
+
+               $nextFormId = $formSet->maxFormIdNumber() + $counterIncrement;
+               $lexeme = new Lexeme(
+                       $this->lexemeId,
+                       $lemmas,
+                       $lexicalCategory,
+                       $language,
+                       null,
+                       $nextFormId,
+                       $formSet->toArray()
+               );
                return GeneratedValueSingle::fromJustValue( $lexeme, 'lexeme' );
        }
 
diff --git a/tests/phpunit/composer/ErisGenerators/TermGenerator.php 
b/tests/phpunit/composer/ErisGenerators/TermGenerator.php
index fdf100a..1e8c340 100644
--- a/tests/phpunit/composer/ErisGenerators/TermGenerator.php
+++ b/tests/phpunit/composer/ErisGenerators/TermGenerator.php
@@ -40,7 +40,10 @@
                $generateTermText = $this->termTextGenerator;
 
                $languageCode = $generateTermLanguage( 3, $rand )->unbox();
-               $text = $generateTermText( $size, $rand )->unbox();
+               do {
+                       $text = $generateTermText( $size + 1, $rand )->unbox();
+               } while ( $text === '' );
+
                return GeneratedValueSingle::fromJustValue( new Term( 
$languageCode, $text ), 'term' );
        }
 
diff --git a/tests/phpunit/composer/ErisGenerators/TermListGenerator.php 
b/tests/phpunit/composer/ErisGenerators/TermListGenerator.php
index 661d476..a058a42 100644
--- a/tests/phpunit/composer/ErisGenerators/TermListGenerator.php
+++ b/tests/phpunit/composer/ErisGenerators/TermListGenerator.php
@@ -17,8 +17,14 @@
         */
        private $termGenerator;
 
-       public function __construct() {
+       /**
+        * @var int
+        */
+       private $minimalSize;
+
+       public function __construct( $minimalSize = 0 ) {
                $this->termGenerator = new TermGenerator();
+               $this->minimalSize = $minimalSize;
        }
 
        /**
@@ -32,7 +38,7 @@
        public function __invoke( $size, $rand ) {
                $generateTerm = $this->termGenerator;
 
-               $listSize = $rand( 0, $size );
+               $listSize = $rand( $this->minimalSize, $size );
 
                $result = new TermList( [] );
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8e5ca10ce400c92d95cfcdda10a5a9ca8f78f9a1
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/WikibaseLexeme
Gerrit-Branch: master
Gerrit-Owner: Aleksey Bekh-Ivanov (WMDE) <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to