2 use Wikimedia\TestingAccessWrapper;
13 [
false,
'http://example.org',
'http://mediawiki.org' ],
15 [
true,
'http://example.org',
'http://example.org' ],
16 [
true,
'https://example.org',
'https://example.org' ],
17 [
true,
'//example.org',
'//example.org' ],
19 [
true,
'http://example.org',
'http://EXAMPLE.ORG' ],
21 [
true,
'http://example.org',
'http://example.org/wiki/Main_Page' ],
22 [
true,
'http://example.org',
'http://example.org?my=query' ],
23 [
true,
'http://example.org',
'http://example.org#its-a-fragment' ],
25 [
false,
'http://example.org',
'https://example.org' ],
26 [
false,
'https://example.org',
'http://example.org' ],
28 [
true,
'//example.org',
'http://example.org' ],
29 [
true,
'//example.org',
'https://example.org' ],
31 [
false,
'//example.org',
'irc://example.org' ],
36 MWTimestamp::setFakeTime(
false );
57 $po->setExtensionData(
"one",
"Foo" );
59 $this->assertEquals(
"Foo", $po->getExtensionData(
"one" ) );
60 $this->assertNull( $po->getExtensionData(
"spam" ) );
62 $po->setExtensionData(
"two",
"Bar" );
63 $this->assertEquals(
"Foo", $po->getExtensionData(
"one" ) );
64 $this->assertEquals(
"Bar", $po->getExtensionData(
"two" ) );
66 $po->setExtensionData(
"one",
null );
67 $this->assertNull( $po->getExtensionData(
"one" ) );
68 $this->assertEquals(
"Bar", $po->getExtensionData(
"two" ) );
80 $po->setProperty(
'foo',
'val' );
82 $properties = $po->getProperties();
83 $this->assertEquals( $po->getProperty(
'foo' ),
'val' );
84 $this->assertEquals( $properties[
'foo'],
'val' );
86 $po->setProperty(
'foo',
'second val' );
88 $properties = $po->getProperties();
89 $this->assertEquals( $po->getProperty(
'foo' ),
'second val' );
90 $this->assertEquals( $properties[
'foo'],
'second val' );
92 $po->unsetProperty(
'foo' );
94 $properties = $po->getProperties();
95 $this->assertEquals( $po->getProperty(
'foo' ),
false );
96 $this->assertArrayNotHasKey(
'foo', $properties );
108 $po->setText(
'Kittens' );
109 $this->assertContains(
'Kittens', $po->getText() );
110 $this->assertNotContains(
'<div', $po->getText() );
111 $this->assertSame(
'Kittens', $po->getRawText() );
113 $po->addWrapperDivClass(
'foo' );
114 $text = $po->getText();
115 $this->assertContains(
'Kittens', $text );
116 $this->assertContains(
'<div', $text );
117 $this->assertContains(
'class="foo"', $text );
119 $po->addWrapperDivClass(
'bar' );
120 $text = $po->getText();
121 $this->assertContains(
'Kittens', $text );
122 $this->assertContains(
'<div', $text );
123 $this->assertContains(
'class="foo bar"', $text );
125 $po->addWrapperDivClass(
'bar' );
126 $text = $po->getText( [
'unwrap' =>
true ] );
127 $this->assertContains(
'Kittens', $text );
128 $this->assertNotContains(
'<div', $text );
129 $this->assertNotContains(
'class="foo bar"', $text );
131 $text = $po->getText( [
'wrapperDivClass' =>
'' ] );
132 $this->assertContains(
'Kittens', $text );
133 $this->assertNotContains(
'<div', $text );
134 $this->assertNotContains(
'class="foo bar"', $text );
136 $text = $po->getText( [
'wrapperDivClass' =>
'xyzzy' ] );
137 $this->assertContains(
'Kittens', $text );
138 $this->assertContains(
'<div', $text );
139 $this->assertContains(
'class="xyzzy"', $text );
140 $this->assertNotContains(
'class="foo bar"', $text );
142 $text = $po->getRawText();
143 $this->assertSame(
'Kittens', $text );
145 $po->clearWrapperDivClass();
146 $text = $po->getText();
147 $this->assertContains(
'Kittens', $text );
148 $this->assertNotContains(
'<div', $text );
149 $this->assertNotContains(
'class="foo bar"', $text );
161 'wgArticlePath' =>
'/wiki/$1',
162 'wgScriptPath' =>
'/w',
163 'wgScript' =>
'/w/index.php',
168 $this->assertSame( $expect, $actual );
176 <mw:toc><
div id=
"toc" class=
"toc"><
div class=
"toctitle"><h2>Contents</h2></
div>
178 <li
class=
"toclevel-1 tocsection-1"><
a href=
"#Section_1"><span
class=
"tocnumber">1</span> <span
class=
"toctext">Section 1</span></
a></li>
179 <li
class=
"toclevel-1 tocsection-2"><
a href=
"#Section_2"><span
class=
"tocnumber">2</span> <span
class=
"toctext">Section 2</span></
a>
181 <li
class=
"toclevel-2 tocsection-3"><
a href=
"#Section_2.1"><span
class=
"tocnumber">2.1</span> <span
class=
"toctext">Section 2.1</span></
a></li>
184 <li
class=
"toclevel-1 tocsection-4"><
a href=
"#Section_3"><span
class=
"tocnumber">3</span> <span
class=
"toctext">Section 3</span></
a></li>
188 <h2><span
class=
"mw-headline" id=
"Section_1">Section 1</span><mw:editsection
page=
"Test Page" section=
"1">Section 1</mw:editsection></h2>
191 <h2><span
class=
"mw-headline" id=
"Section_2">Section 2</span><mw:editsection
page=
"Test Page" section=
"2">Section 2</mw:editsection></h2>
194 <h3><span
class=
"mw-headline" id=
"Section_2.1">Section 2.1</span><mw:editsection
page=
"Test Page" section=
"3">Section 2.1</mw:editsection></h3>
197 <h2><span
class=
"mw-headline" id=
"Section_3">Section 3</span><mw:editsection
page=
"Test Page" section=
"4">Section 3</mw:editsection></h2>
220 <
div id=
"toc" class=
"toc"><
div class=
"toctitle"><h2>Contents</h2></
div>
222 <li
class=
"toclevel-1 tocsection-1"><
a href=
"#Section_1"><span
class=
"tocnumber">1</span> <span
class=
"toctext">Section 1</span></
a></li>
223 <li
class=
"toclevel-1 tocsection-2"><
a href=
"#Section_2"><span
class=
"tocnumber">2</span> <span
class=
"toctext">Section 2</span></
a>
225 <li
class=
"toclevel-2 tocsection-3"><
a href=
"#Section_2.1"><span
class=
"tocnumber">2.1</span> <span
class=
"toctext">Section 2.1</span></
a></li>
228 <li
class=
"toclevel-1 tocsection-4"><
a href=
"#Section_3"><span
class=
"tocnumber">3</span> <span
class=
"toctext">Section 3</span></
a></li>
232 <h2><span
class=
"mw-headline" id=
"Section_1">Section 1</span><span
class=
"mw-editsection"><span
class=
"mw-editsection-bracket">[</span><
a href=
"/w/index.php?title=Test_Page&action=edit&section=1" title=
"Edit section: Section 1">edit</
a><span
class=
"mw-editsection-bracket">]</span></span></h2>
235 <h2><span
class=
"mw-headline" id=
"Section_2">Section 2</span><span
class=
"mw-editsection"><span
class=
"mw-editsection-bracket">[</span><
a href=
"/w/index.php?title=Test_Page&action=edit&section=2" title=
"Edit section: Section 2">edit</
a><span
class=
"mw-editsection-bracket">]</span></span></h2>
238 <h3><span
class=
"mw-headline" id=
"Section_2.1">Section 2.1</span><span
class=
"mw-editsection"><span
class=
"mw-editsection-bracket">[</span><
a href=
"/w/index.php?title=Test_Page&action=edit&section=3" title=
"Edit section: Section 2.1">edit</
a><span
class=
"mw-editsection-bracket">]</span></span></h3>
241 <h2><span
class=
"mw-headline" id=
"Section_3">Section 3</span><span
class=
"mw-editsection"><span
class=
"mw-editsection-bracket">[</span><
a href=
"/w/index.php?title=Test_Page&action=edit&section=4" title=
"Edit section: Section 3">edit</
a><span
class=
"mw-editsection-bracket">]</span></span></h2>
246 'Disable section edit links' => [
247 [
'enableSectionEditLinks' =>
false ], $text, <<<EOF
250 <
div id=
"toc" class=
"toc"><
div class=
"toctitle"><h2>Contents</h2></
div>
252 <li
class=
"toclevel-1 tocsection-1"><
a href=
"#Section_1"><span
class=
"tocnumber">1</span> <span
class=
"toctext">Section 1</span></
a></li>
253 <li
class=
"toclevel-1 tocsection-2"><
a href=
"#Section_2"><span
class=
"tocnumber">2</span> <span
class=
"toctext">Section 2</span></
a>
255 <li
class=
"toclevel-2 tocsection-3"><
a href=
"#Section_2.1"><span
class=
"tocnumber">2.1</span> <span
class=
"toctext">Section 2.1</span></
a></li>
258 <li
class=
"toclevel-1 tocsection-4"><
a href=
"#Section_3"><span
class=
"tocnumber">3</span> <span
class=
"toctext">Section 3</span></
a></li>
262 <h2><span
class=
"mw-headline" id=
"Section_1">Section 1</span></h2>
265 <h2><span
class=
"mw-headline" id=
"Section_2">Section 2</span></h2>
268 <h3><span
class=
"mw-headline" id=
"Section_2.1">Section 2.1</span></h3>
271 <h2><span
class=
"mw-headline" id=
"Section_3">Section 3</span></h2>
276 'Disable TOC, but wrap' => [
277 [
'allowTOC' =>
false,
'wrapperDivClass' =>
'mw-parser-output' ], $text, <<<EOF
281 <h2><span
class=
"mw-headline" id=
"Section_1">Section 1</span><span
class=
"mw-editsection"><span
class=
"mw-editsection-bracket">[</span><
a href=
"/w/index.php?title=Test_Page&action=edit&section=1" title=
"Edit section: Section 1">edit</
a><span
class=
"mw-editsection-bracket">]</span></span></h2>
284 <h2><span
class=
"mw-headline" id=
"Section_2">Section 2</span><span
class=
"mw-editsection"><span
class=
"mw-editsection-bracket">[</span><
a href=
"/w/index.php?title=Test_Page&action=edit&section=2" title=
"Edit section: Section 2">edit</
a><span
class=
"mw-editsection-bracket">]</span></span></h2>
287 <h3><span
class=
"mw-headline" id=
"Section_2.1">Section 2.1</span><span
class=
"mw-editsection"><span
class=
"mw-editsection-bracket">[</span><
a href=
"/w/index.php?title=Test_Page&action=edit&section=3" title=
"Edit section: Section 2.1">edit</
a><span
class=
"mw-editsection-bracket">]</span></span></h3>
290 <h2><span
class=
"mw-headline" id=
"Section_3">Section 3</span><span
class=
"mw-editsection"><span
class=
"mw-editsection-bracket">[</span><
a href=
"/w/index.php?title=Test_Page&action=edit&section=4" title=
"Edit section: Section 3">edit</
a><span
class=
"mw-editsection-bracket">]</span></span></h2>
295 'Style deduplication' => [
296 [], $dedupText, <<<EOF
299 <
link rel=
"mw-deduplicated-inline-style" href=
"mw-data:duplicate1"/>
301 <
link rel=
"mw-deduplicated-inline-style" href=
"mw-data:duplicate1"/>
302 <
link rel=
"mw-deduplicated-inline-style" href=
"mw-data:duplicate2"/>
304 <
link rel=
"mw-deduplicated-inline-style" href=
"mw-data:duplicate1"/>
309 'Style deduplication disabled' => [
310 [
'deduplicateStyles' =>
false ], $dedupText, $dedupText
321 $this->assertTrue( $po->hasText() );
324 $this->assertFalse( $po->hasText() );
327 $this->assertTrue( $po->hasText() );
331 $this->assertTrue( $po->hasText() );
357 $a->setTitleText(
'X' );
359 yield
'only left title text' => [ $a, $b, [
'getTitleText' =>
'X' ] ];
363 $b->setTitleText(
'Y' );
364 yield
'only right title text' => [ $a, $b, [
'getTitleText' =>
'Y' ] ];
367 $a->setTitleText(
'X' );
369 $b->setTitleText(
'Y' );
370 yield
'left title text wins' => [ $a, $b, [
'getTitleText' =>
'X' ] ];
374 $a->setIndexPolicy(
'index' );
376 yield
'only left index policy' => [ $a, $b, [
'getIndexPolicy' =>
'index' ] ];
380 $b->setIndexPolicy(
'index' );
381 yield
'only right index policy' => [ $a, $b, [
'getIndexPolicy' =>
'index' ] ];
384 $a->setIndexPolicy(
'noindex' );
386 $b->setIndexPolicy(
'index' );
387 yield
'left noindex wins' => [ $a, $b, [
'getIndexPolicy' =>
'noindex' ] ];
390 $a->setIndexPolicy(
'index' );
392 $b->setIndexPolicy(
'noindex' );
393 yield
'right noindex wins' => [ $a, $b, [
'getIndexPolicy' =>
'noindex' ] ];
397 $a->addHeadItem(
'<foo1>' );
398 $a->addHeadItem(
'<bar1>',
'bar' );
399 $a->addModules(
'test-module-a' );
400 $a->addModuleStyles(
'test-module-styles-a' );
401 $b->addJsConfigVars(
'test-config-var-a',
'a' );
404 $b->setIndexPolicy(
'noindex' );
405 $b->addHeadItem(
'<foo2>' );
406 $b->addHeadItem(
'<bar2>',
'bar' );
407 $b->addModules(
'test-module-b' );
408 $b->addModuleStyles(
'test-module-styles-b' );
409 $b->addJsConfigVars(
'test-config-var-b',
'b' );
410 $b->addJsConfigVars(
'test-config-var-a',
'X' );
412 yield
'head items and friends' => [ $a, $b, [
422 'getModuleStyles' => [
423 'test-module-styles-a',
424 'test-module-styles-b',
426 'getJsConfigVars' => [
427 'test-config-var-a' =>
'X',
428 'test-config-var-b' =>
'b',
434 $a->setTOCHTML(
'<p>TOC A</p>' );
435 $a->setSections( [ [
'fromtitle' =>
'A1' ], [
'fromtitle' =>
'A2' ] ] );
438 $b->setTOCHTML(
'<p>TOC B</p>' );
439 $b->setSections( [ [
'fromtitle' =>
'B1' ], [
'fromtitle' =>
'B2' ] ] );
441 yield
'concat TOC' => [ $a, $b, [
442 'getTOCHTML' =>
'<p>TOC A</p><p>TOC B</p>',
444 [
'fromtitle' =>
'A1' ],
445 [
'fromtitle' =>
'A2' ],
446 [
'fromtitle' =>
'B1' ],
447 [
'fromtitle' =>
'B2' ]
453 $a->setNewSection(
true );
454 $a->hideNewSection(
true );
455 $a->setNoGallery(
true );
456 $a->addWrapperDivClass(
'foo' );
458 $a->setIndicator(
'foo',
'Foo!' );
459 $a->setIndicator(
'bar',
'Bar!' );
461 $a->setExtensionData(
'foo',
'Foo!' );
462 $a->setExtensionData(
'bar',
'Bar!' );
465 $b->setNoGallery(
true );
466 $b->setEnableOOUI(
true );
467 $b->preventClickjacking(
true );
468 $a->addWrapperDivClass(
'bar' );
470 $b->setIndicator(
'zoo',
'Zoo!' );
471 $b->setIndicator(
'bar',
'Barrr!' );
473 $b->setExtensionData(
'zoo',
'Zoo!' );
474 $b->setExtensionData(
'bar',
'Barrr!' );
476 yield
'skin control flags' => [ $a, $b, [
477 'getNewSection' =>
true,
478 'getHideNewSection' =>
true,
479 'getNoGallery' =>
true,
480 'getEnableOOUI' =>
true,
481 'preventClickjacking' =>
true,
487 'getWrapperDivClass' =>
'foo bar',
488 '$mExtensionData' => [
513 unset( $expected[
'getTOCHTML'] );
514 unset( $expected[
'getSections'] );
520 $po = TestingAccessWrapper::newFromObject( $po );
522 foreach ( $expected
as $method =>
$value ) {
523 if ( $method[0] ===
'$' ) {
524 $field = substr( $method, 1 );
525 $actual = $po->__get( $field );
527 $actual = $po->__call( $method, [] );
530 $this->assertEquals(
$value, $actual, $method );
543 $a->addLanguageLink(
'de' );
544 $a->addLanguageLink(
'ru' );
547 $a->addExternalLink(
'https://kittens.wikimedia.test' );
548 $a->addExternalLink(
'https://goats.wikimedia.test' );
550 $a->addCategory(
'Foo',
'X' );
551 $a->addImage(
'Billy.jpg',
'20180101000013',
'DEAD' );
562 $b->addLanguageLink(
'fr' );
563 $b->addLanguageLink(
'ru' );
566 $b->addExternalLink(
'https://dragons.wikimedia.test' );
567 $b->addExternalLink(
'https://goats.wikimedia.test' );
569 $b->addCategory(
'Bar',
'Y' );
570 $b->addImage(
'Puff.jpg',
'20180101000017',
'BEEF' );
572 yield
'all kinds of links' => [ $a, $b, [
596 'getTemplateIds' => [
605 'getLanguageLinks' => [
'de',
'ru',
'fr' ],
606 'getInterwikiLinks' => [
607 'de' => [
'Kittens_DE' => 1 ],
608 'ru' => [
'Kittens_RU' => 1,
'Dragons_RU' => 1, ],
609 'fr' => [
'Kittens_FR' => 1 ],
611 'getCategories' => [
'Foo' =>
'X',
'Bar' =>
'Y' ],
612 'getImages' => [
'Billy.jpg' => 1,
'Puff.jpg' => 1 ],
613 'getFileSearchOptions' => [
614 'Billy.jpg' => [
'time' =>
'20180101000013',
'sha1' =>
'DEAD' ],
615 'Puff.jpg' => [
'time' =>
'20180101000017',
'sha1' =>
'BEEF' ],
617 'getExternalLinks' => [
618 'https://dragons.wikimedia.test' => 1,
619 'https://kittens.wikimedia.test' => 1,
620 'https://goats.wikimedia.test' => 1,
627 $a->setProperty(
'foo',
'Foo!' );
628 $a->setProperty(
'bar',
'Bar!' );
630 $a->setExtensionData(
'foo',
'Foo!' );
631 $a->setExtensionData(
'bar',
'Bar!' );
635 $b->setProperty(
'zoo',
'Zoo!' );
636 $b->setProperty(
'bar',
'Barrr!' );
638 $b->setExtensionData(
'zoo',
'Zoo!' );
639 $b->setExtensionData(
'bar',
'Barrr!' );
641 yield
'properties' => [ $a, $b, [
647 '$mExtensionData' => [
678 $a->addOutputHook(
'foo',
'X' );
679 $a->addOutputHook(
'bar' );
683 $b->addOutputHook(
'foo',
'Y' );
684 $b->addOutputHook(
'bar' );
685 $b->addOutputHook(
'zoo' );
687 yield
'hooks' => [ $a, $b, [
688 'getOutputHooks' => [
699 $a->addWarning(
'Oops' );
700 $a->addWarning(
'Whoops' );
702 $a->setFlag(
'foo' );
703 $a->setFlag(
'bar' );
705 $a->recordOption(
'Foo' );
706 $a->recordOption(
'Bar' );
710 $b->addWarning(
'Yikes' );
711 $b->addWarning(
'Whoops' );
713 $b->setFlag(
'zoo' );
714 $b->setFlag(
'bar' );
716 $b->recordOption(
'Zoo' );
717 $b->recordOption(
'Bar' );
719 yield
'flags' => [ $a, $b, [
720 'getWarnings' => [
'Oops',
'Whoops',
'Yikes' ],
721 '$mFlags' => [
'foo' =>
true,
'bar' =>
true,
'zoo' =>
true ],
722 'getUsedOptions' => [
'Foo',
'Bar',
'Zoo' ],
727 $a->setTimestamp(
'20180101000011' );
729 yield
'only left timestamp' => [ $a, $b, [
'getTimestamp' =>
'20180101000011' ] ];
733 $b->setTimestamp(
'20180101000011' );
734 yield
'only right timestamp' => [ $a, $b, [
'getTimestamp' =>
'20180101000011' ] ];
737 $a->setTimestamp(
'20180101000011' );
739 $b->setTimestamp(
'20180101000001' );
740 yield
'left timestamp wins' => [ $a, $b, [
'getTimestamp' =>
'20180101000011' ] ];
743 $a->setTimestamp(
'20180101000001' );
745 $b->setTimestamp(
'20180101000011' );
746 yield
'right timestamp wins' => [ $a, $b, [
'getTimestamp' =>
'20180101000011' ] ];
750 $a->setSpeculativeRevIdUsed( 9 );
752 yield
'only left speculative rev id' => [ $a, $b, [
'getSpeculativeRevIdUsed' => 9 ] ];
756 $b->setSpeculativeRevIdUsed( 9 );
757 yield
'only right speculative rev id' => [ $a, $b, [
'getSpeculativeRevIdUsed' => 9 ] ];
760 $a->setSpeculativeRevIdUsed( 9 );
762 $b->setSpeculativeRevIdUsed( 9 );
763 yield
'same speculative rev id' => [ $a, $b, [
'getSpeculativeRevIdUsed' => 9 ] ];
768 $a->setLimitReportData(
'naive1', 7 );
769 $a->setLimitReportData(
'naive2', 27 );
771 $a->setLimitReportData(
'limitreport-simple1', 7 );
772 $a->setLimitReportData(
'limitreport-simple2', 27 );
774 $a->setLimitReportData(
'limitreport-pair1', [ 7, 9 ] );
775 $a->setLimitReportData(
'limitreport-pair2', [ 27, 29 ] );
777 $a->setLimitReportData(
'limitreport-more1', [ 7, 9, 1 ] );
778 $a->setLimitReportData(
'limitreport-more2', [ 27, 29, 21 ] );
780 $a->setLimitReportData(
'limitreport-only-a', 13 );
784 $b->setLimitReportData(
'naive1', 17 );
785 $b->setLimitReportData(
'naive2', 17 );
787 $b->setLimitReportData(
'limitreport-simple1', 17 );
788 $b->setLimitReportData(
'limitreport-simple2', 17 );
790 $b->setLimitReportData(
'limitreport-pair1', [ 17, 19 ] );
791 $b->setLimitReportData(
'limitreport-pair2', [ 17, 19 ] );
793 $b->setLimitReportData(
'limitreport-more1', [ 17, 19, 11 ] );
794 $b->setLimitReportData(
'limitreport-more2', [ 17, 19, 11 ] );
796 $b->setLimitReportData(
'limitreport-only-b', 23 );
799 yield
'limit report' => [ $a, $b, [
800 'getLimitReportData' => [
803 'limitreport-simple1' => 7,
804 'limitreport-simple2' => 27,
805 'limitreport-pair1' => [ 7, 9 ],
806 'limitreport-pair2' => [ 27, 29 ],
807 'limitreport-more1' => [ 7, 9, 1 ],
808 'limitreport-more2' => [ 27, 29, 21 ],
809 'limitreport-only-a' => 13,
811 'getLimitReportJSData' => [
817 'pair1' => [
'value' => 7,
'limit' => 9 ],
818 'pair2' => [
'value' => 27,
'limit' => 29 ],
819 'more1' => [ 7, 9, 1 ],
820 'more2' => [ 27, 29, 21 ],
854 $a = TestingAccessWrapper::newFromObject( $a );
856 $a->resetParseStartTime();
857 $aClocks = $a->mParseStartTime;
861 $a->mergeInternalMetaDataFrom( $b );
862 $mergedClocks = $a->mParseStartTime;
864 foreach ( $mergedClocks
as $clock => $timestamp ) {
865 $this->assertSame( $aClocks[$clock], $timestamp, $clock );
873 $b = TestingAccessWrapper::newFromObject( $b );
875 $b->resetParseStartTime();
877 $bClocks = $b->mParseStartTime;
879 $a->mergeInternalMetaDataFrom( $b->object,
'b' );
880 $mergedClocks = $a->mParseStartTime;
882 foreach ( $mergedClocks
as $clock => $timestamp ) {
883 $this->assertSame( $aClocks[$clock], $timestamp, $clock );
884 $this->assertLessThanOrEqual( $bClocks[$clock], $timestamp, $clock );
889 $a->resetParseStartTime();
890 $aClocks = $a->mParseStartTime;
892 $a->mergeInternalMetaDataFrom( $b->object,
'b' );
893 $mergedClocks = $a->mParseStartTime;
895 foreach ( $mergedClocks
as $clock => $timestamp ) {
896 $this->assertSame( $bClocks[$clock], $timestamp, $clock );
897 $this->assertLessThanOrEqual( $aClocks[$clock], $timestamp, $clock );
902 $a = TestingAccessWrapper::newFromObject( $a );
904 $a->mergeInternalMetaDataFrom( $b->object,
'b' );
905 $mergedClocks = $a->mParseStartTime;
907 foreach ( $mergedClocks
as $clock => $timestamp ) {
908 $this->assertSame( $bClocks[$clock], $timestamp, $clock );
917 $clock = MWTimestamp::convert( TS_UNIX,
'20100101000000' );
918 MWTimestamp::setFakeTime(
function ()
use ( &$clock ) {
923 $time = $po->getCacheTime();
927 $this->assertStringStartsWith(
'2010010100000',
$time );
928 $this->assertSame(
$time, $po->getCacheTime() );
931 $time =
'20110606112233';
932 $po->setCacheTime(
$time );
933 $this->assertSame(
$time, $po->getCacheTime() );
937 $po->setCacheTime(
$time );
938 $this->assertSame(
$time, $po->getCacheTime() );