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