summaryrefslogtreecommitdiff
path: root/extensions/LocalisationUpdate/tests/tokenTest.php
blob: 2b71cc469aa4ed5190bc45dbef4f3306d7f24cca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?php

$IP = strval( getenv( 'MW_INSTALL_PATH' ) ) !== ''
	? getenv( 'MW_INSTALL_PATH' )
	: realpath( dirname( __FILE__ ) . "/../../../" );

require_once "$IP/maintenance/commandLine.inc";

function evalExtractArray( $php, $varname ) {
	eval( $php );
	wfSuppressWarnings();

	return $$varname;
	wfRestoreWarnings();
}

function confExtractArray( $php, $varname ) {
	try {
		$ce = new ConfEditor( "<?php $php" );
		$vars = $ce->getVars();
		wfSuppressWarnings();
		$retval = $vars[$varname];
		wfRestoreWarnings();
	} catch ( Exception $e ) {
		print $e . "\n";
		$retval = null;
	}

	return $retval;
}

function quickTokenExtractArray( $php, $varname ) {
	$reader = new QuickArrayReader( "<?php $php" );

	return $reader->getVar( $varname );
}

if ( count( $args ) ) {
	$sources = $args;
} else {
	$sources =
		array_merge(
			glob( "$IP/extensions/*/*.i18n.php" ),
			glob( "$IP/languages/messages/Messages*.php" ) );
}

foreach ( $sources as $sourceFile ) {
	$rel = basename( $sourceFile );
	$out = str_replace( '/', '-', $rel );

	$sourceData = file_get_contents( $sourceFile );

	if ( preg_match( '!extensions/!', $sourceFile ) ) {
		$sourceData = LocalisationUpdate::cleanupExtensionFile( $sourceData );
		$items = 'langs';
	} else {
		$sourceData = LocalisationUpdate::cleanupFile( $sourceData );
		$items = 'messages';
	}

	file_put_contents( "$out.txt", $sourceData );

	$start = microtime( true );
	$eval = evalExtractArray( $sourceData, 'messages' );
	$deltaEval = microtime( true ) - $start;

	$start = microtime( true );
	$quick = quickTokenExtractArray( $sourceData, 'messages' );
	$deltaQuick = microtime( true ) - $start;

	$start = microtime( true );
	$token = confExtractArray( $sourceData, 'messages' );
	$deltaToken = microtime( true ) - $start;

	$hashEval = md5( serialize( $eval ) );
	$hashToken = md5( serialize( $token ) );
	$hashQuick = md5( serialize( $quick ) );
	$countEval = count( (array)$eval );
	$countToken = count( (array)$token );
	$countQuick = count( (array)$quick );

	printf( "%s %s %d $items - %0.1fms - eval\n",
		$rel, $hashEval, $countEval, $deltaEval * 1000 );
	printf( "%s %s %d $items - %0.1fms - QuickArrayReader\n",
		$rel, $hashQuick, $countQuick, $deltaQuick * 1000 );
	printf( "%s %s %d $items - %0.1fms - ConfEditor\n",
		$rel, $hashToken, $countToken, $deltaToken * 1000 );

	if ( $hashEval !== $hashToken || $hashEval !== $hashQuick ) {
		echo "FAILED on $rel\n";
		file_put_contents( "$out-eval.txt", var_export( $eval, true ) );
		file_put_contents( "$out-token.txt", var_export( $token, true ) );
		file_put_contents( "$out-quick.txt", var_export( $quick, true ) );
		#die("check eval.txt and token.txt\n");
	}
	echo "\n";
}

echo "ok\n";