wiki.techinc.nl/tests/qunit/data/generateJqueryMsgData.php
Timo Tijhof f5b7f9ccb0 Phase out tests/jasmine; Update mediawiki i18n tests
Updated script for generating mediawiki.jqueryMsg sample
data to be generic instead of Jasmine specific

Removed mediawiki.jqueryMsg.spec.js
* The bulk of the tests were already in QUnit (did that a
  while ago)
* The little $.each loop over the sample data is now in
  QUnit as well.
* Made it so that it doesn't need a hardcoded copy of
  languageClasses but instead pulls it from load.php
  on-demand and then restores mw.language later on.

The mediawiki.jqueryMsg.test module now has several failures
which is annoying but should not block the merge for now
because they were failing under Jasmine as well, this is a
known bug in jqueryMsg, a few cases don't work in js yet.
To be investigated (12/66 fail currently).

Change-Id: I243d055d6f5129fd9fd760943d05c7cd210d84bf
2012-10-08 13:16:53 +02:00

149 lines
4.7 KiB
PHP

<?php
/**
* This PHP script defines the spec that the mediawiki.jqueryMsg module should conform to.
*
* It does this by looking up the results of various kinds of string parsing, with various
* languages, in the current installation of MediaWiki. It then outputs a static specification,
* mapping expected inputs to outputs, which can be used fed into a unit test framework.
* (QUnit, Jasmine, anything, it just outputs an object with key/value pairs).
*
* This is similar to Michael Dale (mdale@mediawiki.org)'s parser tests, except that it doesn't
* look up the API results while doing the test, so the test run is much faster (at the cost
* of being out of date in rare circumstances. But mostly the parsing that we are doing in
* Javascript doesn't change much).
*/
/*
* @example QUnit
* <code>
QUnit.test( 'Output matches PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
mw.messages.set( mw.libs.phpParserData.messages );
$.each( mw.libs.phpParserData.tests, function ( i, test ) {
QUnit.stop();
getMwLanguage( test.lang, function ( langClass ) {
var parser = new mw.jqueryMsg.parser( { language: langClass } );
assert.equal(
parser.parse( test.key, test.args ).html(),
test.result,
test.name
);
QUnit.start();
} );
} );
});
* </code>
*
* @example Jasmine
* <code>
describe( 'match output to output from PHP parser', function () {
mw.messages.set( mw.libs.phpParserData.messages );
$.each( mw.libs.phpParserData.tests, function ( i, test ) {
it( 'should parse ' + test.name, function () {
var langClass;
runs( function () {
getMwLanguage( test.lang, function ( gotIt ) {
langClass = gotIt;
});
});
waitsFor( function () {
return langClass !== undefined;
}, 'Language class should be loaded', 1000 );
runs( function () {
console.log( test.lang, 'running tests' );
var parser = new mw.jqueryMsg.parser( { language: langClass } );
expect(
parser.parse( test.key, test.args ).html()
).toEqual( test.result );
} );
} );
} );
} );
* </code>
*/
$maintenanceDir = dirname( dirname( dirname( __DIR__ ) ) ) . '/maintenance';
require( "$maintenanceDir/Maintenance.php" );
class GenerateJqueryMsgData extends Maintenance {
static $keyToTestArgs = array(
'undelete_short' => array(
array( 0 ),
array( 1 ),
array( 2 ),
array( 5 ),
array( 21 ),
array( 101 )
),
'category-subcat-count' => array(
array( 0, 10 ),
array( 1, 1 ),
array( 1, 2 ),
array( 3, 30 )
)
);
public function __construct() {
parent::__construct();
$this->mDescription = 'Create a specification for message parsing ini JSON format';
// add any other options here
}
public function execute() {
list( $messages, $tests ) = $this->getMessagesAndTests();
$this->writeJavascriptFile( $messages, $tests, __DIR__ . '/mediawiki.jqueryMsg.data.js' );
}
private function getMessagesAndTests() {
$messages = array();
$tests = array();
foreach ( array( 'en', 'fr', 'ar', 'jp', 'zh' ) as $languageCode ) {
foreach ( self::$keyToTestArgs as $key => $testArgs ) {
foreach ($testArgs as $args) {
// Get the raw message, without any transformations.
$template = wfMessage( $key )->inLanguage( $languageCode )->plain();
// Get the magic-parsed version with args.
$result = wfMessage( $key, $args )->inLanguage( $languageCode )->text();
// Record the template, args, language, and expected result
// fake multiple languages by flattening them together.
$langKey = $languageCode . '_' . $key;
$messages[$langKey] = $template;
$tests[] = array(
'name' => $languageCode . ' ' . $key . ' ' . join( ',', $args ),
'key' => $langKey,
'args' => $args,
'result' => $result,
'lang' => $languageCode
);
}
}
}
return array( $messages, $tests );
}
private function writeJavascriptFile( $messages, $tests, $dataSpecFile ) {
$phpParserData = array(
'messages' => $messages,
'tests' => $tests,
);
$output =
"// This file stores the output from the PHP parser for various messages, arguments,\n"
. "// languages, and parser modes. Intended for use by a unit test framework by looping\n"
. "// through the object and comparing its parser return value with the 'result' property.\n"
. '// Last generated with ' . basename( __FILE__ ) . ' at ' . gmdate( 'r' ) . "\n"
. "\n"
. 'mediaWiki.libs.phpParserData = ' . FormatJson::encode( $phpParserData, true ) . ";\n";
$fp = file_put_contents( $dataSpecFile, $output );
if ( $fp === false ) {
die( "Couldn't write to $dataSpecFile." );
}
}
}
$maintClass = "GenerateJqueryMsgData";
require_once( "$maintenanceDir/doMaintenance.php" );