summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/.htaccess1
-rw-r--r--tests/RunSeleniumTests.php233
-rw-r--r--tests/TestsAutoLoader.php35
-rw-r--r--tests/jasmine/.htaccess1
-rw-r--r--tests/jasmine/SpecRunner.html28
-rw-r--r--tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE20
-rw-r--r--tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js188
-rw-r--r--tests/jasmine/lib/jasmine-1.0.1/jasmine.css166
-rw-r--r--tests/jasmine/lib/jasmine-1.0.1/jasmine.js2421
-rw-r--r--tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js488
-rw-r--r--tests/jasmine/spec/mediawiki.jqueryMsg.spec.js389
-rw-r--r--tests/jasmine/spec_makers/makeJqueryMsgSpec.php110
-rw-r--r--tests/parser/README8
-rw-r--r--tests/parser/extraParserTests.txtbin1261 -> 0 bytes
-rw-r--r--tests/parser/parserTest.inc1330
-rw-r--r--tests/parser/parserTests.txt10363
-rw-r--r--tests/parser/parserTestsParserHook.php70
-rw-r--r--tests/parser/preprocess/All_system_messages.expected5646
-rw-r--r--tests/parser/preprocess/All_system_messages.txt5645
-rw-r--r--tests/parser/preprocess/Factorial.expected17
-rw-r--r--tests/parser/preprocess/Factorial.txt16
-rw-r--r--tests/parser/preprocess/Fundraising.expected18
-rw-r--r--tests/parser/preprocess/Fundraising.txt17
-rw-r--r--tests/parser/preprocess/QuoteQuran.expected140
-rw-r--r--tests/parser/preprocess/QuoteQuran.txt139
-rw-r--r--tests/parserTests.php92
-rw-r--r--tests/phpunit/Makefile91
-rw-r--r--tests/phpunit/MediaWikiLangTestCase.php42
-rw-r--r--tests/phpunit/MediaWikiPHPUnitCommand.php76
-rw-r--r--tests/phpunit/MediaWikiTestCase.php547
-rw-r--r--tests/phpunit/README53
-rw-r--r--tests/phpunit/StructureTest.php60
-rw-r--r--tests/phpunit/TODO10
-rw-r--r--tests/phpunit/bootstrap.php32
-rw-r--r--tests/phpunit/data/db/mysql/functions.sql12
-rw-r--r--tests/phpunit/data/db/postgres/functions.sql12
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.13.sql342
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.15.sql454
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.16.sql483
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.17.sql516
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.18.sql535
-rw-r--r--tests/phpunit/data/media/1bit-png.pngbin167 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/80x60-2layers.xcfbin1162 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/80x60-Greyscale.xcfbin667 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/80x60-RGB.xcfbin677 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/Animated_PNG_example_bouncing_beach_ball.pngbin72209 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/Gtk-media-play-ltr.svg35
-rw-r--r--tests/phpunit/data/media/Png-native-test.pngbin4665 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/QA_icon.svg77
-rw-r--r--tests/phpunit/data/media/README38
-rw-r--r--tests/phpunit/data/media/Toll_Texas_1.svg150
-rw-r--r--tests/phpunit/data/media/US_states_by_total_state_tax_revenue.svg248
-rw-r--r--tests/phpunit/data/media/Wikimedia-logo.svg14
-rw-r--r--tests/phpunit/data/media/Xmp-exif-multilingual_test.jpgbin12544 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/animated-xmp.gifbin3864 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/animated.gifbin497 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/broken_exif_date.jpgbin3233 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/exif-gps.jpgbin665 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/exif-user-comment.jpgbin484 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/greyscale-na-png.pngbin365 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/greyscale-png.pngbin415 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/iptc-invalid-psir.jpgbin9574 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/iptc-timetest-invalid.jpgbin9573 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/iptc-timetest.jpgbin9573 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-comment-binary.jpgbin448 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-comment-iso8859-1.jpgbin447 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-comment-multiple.jpgbin431 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-comment-utf.jpgbin445 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-iptc-bad-hash.jpgbin499 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-iptc-good-hash.jpgbin499 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-padding-even.jpgbin450 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-padding-odd.jpgbin451 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-xmp-alt.jpgbin3255 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-xmp-psir.jpgbin3308 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-xmp-psir.xmp35
-rw-r--r--tests/phpunit/data/media/landscape-plain.jpgbin38771 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/nonanimated.gifbin200 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/portrait-rotated.jpgbin38577 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/rgb-na-png.pngbin593 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/rgb-png.pngbin663 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/test.jpgbin437 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/test.tiffbin566 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/xmp.pngbin582 -> 0 bytes
-rw-r--r--tests/phpunit/data/xmp/1.result.php8
-rw-r--r--tests/phpunit/data/xmp/1.xmp11
-rw-r--r--tests/phpunit/data/xmp/2.result.php8
-rw-r--r--tests/phpunit/data/xmp/2.xmp12
-rw-r--r--tests/phpunit/data/xmp/3-invalid.result.php7
-rw-r--r--tests/phpunit/data/xmp/3-invalid.xmp31
-rw-r--r--tests/phpunit/data/xmp/3.result.php8
-rw-r--r--tests/phpunit/data/xmp/3.xmp29
-rw-r--r--tests/phpunit/data/xmp/4.result.php7
-rw-r--r--tests/phpunit/data/xmp/4.xmp22
-rw-r--r--tests/phpunit/data/xmp/5.result.php7
-rw-r--r--tests/phpunit/data/xmp/5.xmp16
-rw-r--r--tests/phpunit/data/xmp/6.result.php8
-rw-r--r--tests/phpunit/data/xmp/6.xmp18
-rw-r--r--tests/phpunit/data/xmp/7.result.php52
-rw-r--r--tests/phpunit/data/xmp/7.xmp67
-rw-r--r--tests/phpunit/data/xmp/README3
-rw-r--r--tests/phpunit/data/xmp/bag-for-seq.result.php10
-rw-r--r--tests/phpunit/data/xmp/bag-for-seq.xmp1
-rw-r--r--tests/phpunit/data/xmp/flash.result.php8
-rw-r--r--tests/phpunit/data/xmp/flash.xmp11
-rw-r--r--tests/phpunit/data/xmp/gps.result.php12
-rw-r--r--tests/phpunit/data/xmp/gps.xmp17
-rw-r--r--tests/phpunit/data/xmp/invalid-child-not-struct.result.php7
-rw-r--r--tests/phpunit/data/xmp/invalid-child-not-struct.xmp12
-rw-r--r--tests/phpunit/data/xmp/no-namespace.result.php7
-rw-r--r--tests/phpunit/data/xmp/no-namespace.xmp11
-rw-r--r--tests/phpunit/data/xmp/no-recognized-props.result.php2
-rw-r--r--tests/phpunit/data/xmp/no-recognized-props.xmp8
-rw-r--r--tests/phpunit/data/xmp/utf16BE.result.php12
-rw-r--r--tests/phpunit/data/xmp/utf16BE.xmpbin930 -> 0 bytes
-rw-r--r--tests/phpunit/data/xmp/utf16LE.result.php12
-rw-r--r--tests/phpunit/data/xmp/utf16LE.xmpbin930 -> 0 bytes
-rw-r--r--tests/phpunit/data/xmp/utf32BE.result.php12
-rw-r--r--tests/phpunit/data/xmp/utf32BE.xmpbin1856 -> 0 bytes
-rw-r--r--tests/phpunit/data/xmp/utf32LE.result.php12
-rw-r--r--tests/phpunit/data/xmp/utf32LE.xmpbin1856 -> 0 bytes
-rw-r--r--tests/phpunit/data/xmp/xmpExt.result.php8
-rw-r--r--tests/phpunit/data/xmp/xmpExt.xmp13
-rw-r--r--tests/phpunit/data/xmp/xmpExt2.xmp8
-rw-r--r--tests/phpunit/data/zip/cd-gap.zipbin182 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/cd-truncated.zipbin171 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/class-trailing-null.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/class-trailing-slash.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/class.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/empty.zipbin22 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/looks-like-zip64.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/nosig.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/split.zipbin196 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/trail.zipbin181 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/wrong-cd-start-disk.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/wrong-central-entry-sig.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/docs/ExportDemoTest.php36
-rw-r--r--tests/phpunit/includes/ArticleTablesTest.php33
-rw-r--r--tests/phpunit/includes/ArticleTest.php82
-rw-r--r--tests/phpunit/includes/BlockTest.php230
-rw-r--r--tests/phpunit/includes/CdbTest.php84
-rw-r--r--tests/phpunit/includes/DiffHistoryBlobTest.php40
-rw-r--r--tests/phpunit/includes/EditPageTest.php40
-rw-r--r--tests/phpunit/includes/ExternalStoreTest.php32
-rw-r--r--tests/phpunit/includes/ExtraParserTest.php169
-rw-r--r--tests/phpunit/includes/FauxResponseTest.php70
-rw-r--r--tests/phpunit/includes/FormOptionsInitializationTest.php85
-rw-r--r--tests/phpunit/includes/FormOptionsTest.php90
-rw-r--r--tests/phpunit/includes/GlobalFunctions/GlobalTest.php598
-rw-r--r--tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php29
-rw-r--r--tests/phpunit/includes/GlobalFunctions/README2
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php111
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php133
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php36
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php80
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php35
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php90
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php28
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php134
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php120
-rw-r--r--tests/phpunit/includes/HooksTest.php102
-rw-r--r--tests/phpunit/includes/HtmlTest.php580
-rw-r--r--tests/phpunit/includes/HttpTest.php180
-rw-r--r--tests/phpunit/includes/IPTest.php542
-rw-r--r--tests/phpunit/includes/JsonTest.php33
-rw-r--r--tests/phpunit/includes/LanguageConverterTest.php130
-rw-r--r--tests/phpunit/includes/LicensesTest.php22
-rw-r--r--tests/phpunit/includes/LinksUpdateTest.php154
-rw-r--r--tests/phpunit/includes/LocalFileTest.php108
-rw-r--r--tests/phpunit/includes/LocalisationCacheTest.php31
-rw-r--r--tests/phpunit/includes/MWFunctionTest.php86
-rw-r--r--tests/phpunit/includes/MWNamespaceTest.php628
-rw-r--r--tests/phpunit/includes/MessageTest.php64
-rw-r--r--tests/phpunit/includes/ParserOptionsTest.php35
-rw-r--r--tests/phpunit/includes/PathRouterTest.php254
-rw-r--r--tests/phpunit/includes/PreferencesTest.php75
-rw-r--r--tests/phpunit/includes/Providers.php44
-rw-r--r--tests/phpunit/includes/RecentChangeTest.php273
-rw-r--r--tests/phpunit/includes/ResourceLoaderTest.php91
-rw-r--r--tests/phpunit/includes/RevisionStorageTest.php408
-rw-r--r--tests/phpunit/includes/RevisionTest.php125
-rw-r--r--tests/phpunit/includes/SampleTest.php98
-rw-r--r--tests/phpunit/includes/SanitizerTest.php162
-rw-r--r--tests/phpunit/includes/SanitizerValidateEmailTest.php79
-rw-r--r--tests/phpunit/includes/SeleniumConfigurationTest.php228
-rw-r--r--tests/phpunit/includes/SiteConfigurationTest.php311
-rw-r--r--tests/phpunit/includes/TemplateCategoriesTest.php36
-rw-r--r--tests/phpunit/includes/TestUser.php58
-rw-r--r--tests/phpunit/includes/TimeAdjustTest.php51
-rw-r--r--tests/phpunit/includes/TimestampTest.php72
-rw-r--r--tests/phpunit/includes/TitleMethodsTest.php201
-rw-r--r--tests/phpunit/includes/TitlePermissionTest.php660
-rw-r--r--tests/phpunit/includes/TitleTest.php155
-rw-r--r--tests/phpunit/includes/UserTest.php171
-rw-r--r--tests/phpunit/includes/WebRequestTest.php216
-rw-r--r--tests/phpunit/includes/WikiPageTest.php784
-rw-r--r--tests/phpunit/includes/XmlJsTest.php9
-rw-r--r--tests/phpunit/includes/XmlSelectTest.php139
-rw-r--r--tests/phpunit/includes/XmlTest.php342
-rw-r--r--tests/phpunit/includes/ZipDirectoryReaderTest.php79
-rw-r--r--tests/phpunit/includes/api/ApiBlockTest.php117
-rw-r--r--tests/phpunit/includes/api/ApiEditPageTest.php84
-rw-r--r--tests/phpunit/includes/api/ApiOptionsTest.php276
-rw-r--r--tests/phpunit/includes/api/ApiPurgeTest.php40
-rw-r--r--tests/phpunit/includes/api/ApiQueryTest.php68
-rw-r--r--tests/phpunit/includes/api/ApiTest.php280
-rw-r--r--tests/phpunit/includes/api/ApiTestCase.php187
-rw-r--r--tests/phpunit/includes/api/ApiTestCaseUpload.php148
-rw-r--r--tests/phpunit/includes/api/ApiUploadTest.php569
-rw-r--r--tests/phpunit/includes/api/ApiWatchTest.php176
-rw-r--r--tests/phpunit/includes/api/PrefixUniquenessTest.php24
-rw-r--r--tests/phpunit/includes/api/RandomImageGenerator.php463
-rw-r--r--tests/phpunit/includes/api/format/ApiFormatPhpTest.php19
-rw-r--r--tests/phpunit/includes/api/format/ApiFormatTestBase.php22
-rw-r--r--tests/phpunit/includes/api/generateRandomImages.php51
-rw-r--r--tests/phpunit/includes/api/words.txt1000
-rw-r--r--tests/phpunit/includes/cache/GenderCacheTest.php101
-rw-r--r--tests/phpunit/includes/cache/ProcessCacheLRUTest.php239
-rw-r--r--tests/phpunit/includes/db/DatabaseSQLTest.php147
-rw-r--r--tests/phpunit/includes/db/DatabaseSqliteTest.php326
-rw-r--r--tests/phpunit/includes/db/DatabaseTest.php215
-rw-r--r--tests/phpunit/includes/db/ORMRowTest.php234
-rw-r--r--tests/phpunit/includes/db/TestORMRowTest.php174
-rw-r--r--tests/phpunit/includes/debug/MWDebugTest.php68
-rw-r--r--tests/phpunit/includes/filerepo/FileBackendTest.php1868
-rw-r--r--tests/phpunit/includes/filerepo/FileRepoTest.php45
-rw-r--r--tests/phpunit/includes/filerepo/StoreBatchTest.php123
-rw-r--r--tests/phpunit/includes/installer/InstallDocFormatterTest.php64
-rw-r--r--tests/phpunit/includes/json/ServicesJsonTest.php93
-rw-r--r--tests/phpunit/includes/libs/CSSJanusTest.php560
-rw-r--r--tests/phpunit/includes/libs/CSSMinTest.php142
-rw-r--r--tests/phpunit/includes/libs/GenericArrayObjectTest.php245
-rw-r--r--tests/phpunit/includes/libs/IEUrlExtensionTest.php118
-rw-r--r--tests/phpunit/includes/libs/JavaScriptMinifierTest.php170
-rw-r--r--tests/phpunit/includes/media/BitmapMetadataHandlerTest.php146
-rw-r--r--tests/phpunit/includes/media/BitmapScalingTest.php151
-rw-r--r--tests/phpunit/includes/media/ExifBitmapTest.php100
-rw-r--r--tests/phpunit/includes/media/ExifRotationTest.php260
-rw-r--r--tests/phpunit/includes/media/ExifTest.php48
-rw-r--r--tests/phpunit/includes/media/FormatMetadataTest.php52
-rw-r--r--tests/phpunit/includes/media/GIFMetadataExtractorTest.php96
-rw-r--r--tests/phpunit/includes/media/GIFTest.php98
-rw-r--r--tests/phpunit/includes/media/IPTCTest.php55
-rw-r--r--tests/phpunit/includes/media/JpegMetadataExtractorTest.php94
-rw-r--r--tests/phpunit/includes/media/JpegTest.php31
-rw-r--r--tests/phpunit/includes/media/MediaHandlerTest.php50
-rw-r--r--tests/phpunit/includes/media/PNGMetadataExtractorTest.php141
-rw-r--r--tests/phpunit/includes/media/PNGTest.php100
-rw-r--r--tests/phpunit/includes/media/SVGMetadataExtractorTest.php108
-rw-r--r--tests/phpunit/includes/media/TiffTest.php35
-rw-r--r--tests/phpunit/includes/media/XMPTest.php158
-rw-r--r--tests/phpunit/includes/media/XMPValidateTest.php47
-rw-r--r--tests/phpunit/includes/mobile/DeviceDetectionTest.php40
-rw-r--r--tests/phpunit/includes/normal/CleanUpTest.php382
-rw-r--r--tests/phpunit/includes/parser/MagicVariableTest.php201
-rw-r--r--tests/phpunit/includes/parser/MediaWikiParserTest.php36
-rw-r--r--tests/phpunit/includes/parser/NewParserTest.php895
-rw-r--r--tests/phpunit/includes/parser/ParserMethodsTest.php33
-rw-r--r--tests/phpunit/includes/parser/ParserPreloadTest.php67
-rw-r--r--tests/phpunit/includes/parser/PreprocessorTest.php233
-rw-r--r--tests/phpunit/includes/parser/TagHooksTest.php77
-rw-r--r--tests/phpunit/includes/search/SearchEngineTest.php163
-rw-r--r--tests/phpunit/includes/search/SearchUpdateTest.php90
-rw-r--r--tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php79
-rw-r--r--tests/phpunit/includes/specials/SpecialRecentchangesTest.php132
-rw-r--r--tests/phpunit/includes/specials/SpecialSearchTest.php116
-rw-r--r--tests/phpunit/includes/upload/UploadFromUrlTest.php351
-rw-r--r--tests/phpunit/includes/upload/UploadStashTest.php77
-rw-r--r--tests/phpunit/includes/upload/UploadTest.php141
-rw-r--r--tests/phpunit/install-phpunit.sh36
-rw-r--r--tests/phpunit/languages/LanguageAmTest.php33
-rw-r--r--tests/phpunit/languages/LanguageArTest.php78
-rw-r--r--tests/phpunit/languages/LanguageBeTest.php40
-rw-r--r--tests/phpunit/languages/LanguageBe_taraskTest.php65
-rw-r--r--tests/phpunit/languages/LanguageBhTest.php34
-rw-r--r--tests/phpunit/languages/LanguageBsTest.php41
-rw-r--r--tests/phpunit/languages/LanguageCsTest.php40
-rw-r--r--tests/phpunit/languages/LanguageCuTest.php41
-rw-r--r--tests/phpunit/languages/LanguageCyTest.php42
-rw-r--r--tests/phpunit/languages/LanguageDsbTest.php40
-rw-r--r--tests/phpunit/languages/LanguageFrTest.php34
-rw-r--r--tests/phpunit/languages/LanguageGaTest.php34
-rw-r--r--tests/phpunit/languages/LanguageGdTest.php38
-rw-r--r--tests/phpunit/languages/LanguageGvTest.php39
-rw-r--r--tests/phpunit/languages/LanguageHeTest.php48
-rw-r--r--tests/phpunit/languages/LanguageHiTest.php34
-rw-r--r--tests/phpunit/languages/LanguageHrTest.php41
-rw-r--r--tests/phpunit/languages/LanguageHsbTest.php40
-rw-r--r--tests/phpunit/languages/LanguageHuTest.php34
-rw-r--r--tests/phpunit/languages/LanguageHyTest.php34
-rw-r--r--tests/phpunit/languages/LanguageKshTest.php34
-rw-r--r--tests/phpunit/languages/LanguageLnTest.php34
-rw-r--r--tests/phpunit/languages/LanguageLtTest.php53
-rw-r--r--tests/phpunit/languages/LanguageLvTest.php39
-rw-r--r--tests/phpunit/languages/LanguageMgTest.php35
-rw-r--r--tests/phpunit/languages/LanguageMkTest.php41
-rw-r--r--tests/phpunit/languages/LanguageMlTest.php43
-rw-r--r--tests/phpunit/languages/LanguageMoTest.php43
-rw-r--r--tests/phpunit/languages/LanguageMtTest.php72
-rw-r--r--tests/phpunit/languages/LanguageNlTest.php28
-rw-r--r--tests/phpunit/languages/LanguageNsoTest.php32
-rw-r--r--tests/phpunit/languages/LanguagePlTest.php72
-rw-r--r--tests/phpunit/languages/LanguageRoTest.php43
-rw-r--r--tests/phpunit/languages/LanguageRuTest.php54
-rw-r--r--tests/phpunit/languages/LanguageSeTest.php48
-rw-r--r--tests/phpunit/languages/LanguageSgsTest.php66
-rw-r--r--tests/phpunit/languages/LanguageShTest.php32
-rw-r--r--tests/phpunit/languages/LanguageSkTest.php40
-rw-r--r--tests/phpunit/languages/LanguageSlTest.php42
-rw-r--r--tests/phpunit/languages/LanguageSmaTest.php48
-rw-r--r--tests/phpunit/languages/LanguageSrTest.php223
-rw-r--r--tests/phpunit/languages/LanguageTest.php1069
-rw-r--r--tests/phpunit/languages/LanguageTiTest.php32
-rw-r--r--tests/phpunit/languages/LanguageTlTest.php32
-rw-r--r--tests/phpunit/languages/LanguageTrTest.php68
-rw-r--r--tests/phpunit/languages/LanguageUkTest.php54
-rw-r--r--tests/phpunit/languages/LanguageUzTest.php120
-rw-r--r--tests/phpunit/languages/LanguageWaTest.php32
-rw-r--r--tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php95
-rw-r--r--tests/phpunit/maintenance/DumpTestCase.php352
-rw-r--r--tests/phpunit/maintenance/MaintenanceTest.php812
-rw-r--r--tests/phpunit/maintenance/backupPrefetchTest.php270
-rw-r--r--tests/phpunit/maintenance/backupTextPassTest.php563
-rw-r--r--tests/phpunit/maintenance/backup_LogTest.php227
-rw-r--r--tests/phpunit/maintenance/backup_PageTest.php389
-rw-r--r--tests/phpunit/maintenance/fetchTextTest.php243
-rw-r--r--tests/phpunit/maintenance/getSlaveServerTest.php69
-rw-r--r--tests/phpunit/phpunit.php107
-rw-r--r--tests/phpunit/run-tests.bat1
-rw-r--r--tests/phpunit/skins/SideBarTest.php209
-rw-r--r--tests/phpunit/suite.xml49
-rw-r--r--tests/phpunit/suites/ExtensionsTestSuite.php33
-rw-r--r--tests/phpunit/suites/UploadFromUrlTestSuite.php204
-rw-r--r--tests/qunit/.htaccess1
-rw-r--r--tests/qunit/QUnitTestResources.php63
-rw-r--r--tests/qunit/data/callMwLoaderTestCallback.js1
-rw-r--r--tests/qunit/data/load.mock.php58
-rw-r--r--tests/qunit/data/qunitOkCall.js2
-rw-r--r--tests/qunit/data/styleTest.css.php61
-rw-r--r--tests/qunit/data/testrunner.js266
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js52
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.byteLength.test.js33
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js234
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.client.test.js317
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js58
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js35
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js11
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.highlightText.test.js232
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.localize.test.js133
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js58
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js33
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js697
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.textSelection.test.js275
-rw-r--r--tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js26
-rw-r--r--tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js59
-rw-r--r--tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js62
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js200
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js388
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js74
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js97
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js62
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js394
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.test.js649
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js56
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js288
-rw-r--r--tests/selenium/Selenium.php190
-rw-r--r--tests/selenium/SeleniumConfig.php79
-rw-r--r--tests/selenium/SeleniumLoader.php9
-rw-r--r--tests/selenium/SeleniumServerManager.php239
-rw-r--r--tests/selenium/SeleniumTestCase.php127
-rw-r--r--tests/selenium/SeleniumTestConsoleLogger.php25
-rw-r--r--tests/selenium/SeleniumTestConstants.php24
-rw-r--r--tests/selenium/SeleniumTestHTMLLogger.php36
-rw-r--r--tests/selenium/SeleniumTestListener.php68
-rw-r--r--tests/selenium/SeleniumTestSuite.php57
-rw-r--r--tests/selenium/data/SimpleSeleniumTestDB.sql1453
-rw-r--r--tests/selenium/data/SimpleSeleniumTestImages.zipbin21993 -> 0 bytes
-rw-r--r--tests/selenium/data/Wikipedia-logo-v2-de.pngbin21479 -> 0 bytes
-rw-r--r--tests/selenium/data/mediawiki118_fresh_installation.sql1543
-rw-r--r--tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php102
-rw-r--r--tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php82
-rw-r--r--tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php95
-rw-r--r--tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php136
-rw-r--r--tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php132
-rw-r--r--tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php140
-rw-r--r--tests/selenium/installer/MediaWikiInstallationCommonFunction.php283
-rw-r--r--tests/selenium/installer/MediaWikiInstallationConfig.php49
-rw-r--r--tests/selenium/installer/MediaWikiInstallationMessage.php57
-rw-r--r--tests/selenium/installer/MediaWikiInstallationVariables.php77
-rw-r--r--tests/selenium/installer/MediaWikiInstallerTestSuite.php53
-rw-r--r--tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php78
-rw-r--r--tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php79
-rw-r--r--tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php71
-rw-r--r--tests/selenium/installer/MediaWikiRestartInstallationTestCase.php115
-rw-r--r--tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php93
-rw-r--r--tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php117
-rw-r--r--tests/selenium/installer/MediaWikiUserInterfaceTestCase.php531
-rw-r--r--tests/selenium/installer/README.txt32
-rw-r--r--tests/selenium/selenium_settings.ini.sample32
-rw-r--r--tests/selenium/selenium_settings_grid.ini.sample16
-rw-r--r--tests/selenium/suites/AddContentToNewPageTestCase.php182
-rw-r--r--tests/selenium/suites/AddNewPageTestCase.php65
-rw-r--r--tests/selenium/suites/CreateAccountTestCase.php114
-rw-r--r--tests/selenium/suites/DeletePageAdminTestCase.php89
-rw-r--r--tests/selenium/suites/EmailPasswordTestCase.php81
-rw-r--r--tests/selenium/suites/MediaWikiEditorConfig.php48
-rw-r--r--tests/selenium/suites/MediaWikiEditorTestSuite.php18
-rw-r--r--tests/selenium/suites/MediaWikiExtraTestSuite.php20
-rw-r--r--tests/selenium/suites/MediawikiCoreSmokeTestCase.php69
-rw-r--r--tests/selenium/suites/MediawikiCoreSmokeTestSuite.php19
-rw-r--r--tests/selenium/suites/MovePageTestCase.php117
-rw-r--r--tests/selenium/suites/MyContributionsTestCase.php65
-rw-r--r--tests/selenium/suites/MyWatchListTestCase.php57
-rw-r--r--tests/selenium/suites/PageDeleteTestSuite.php16
-rw-r--r--tests/selenium/suites/PageSearchTestCase.php105
-rw-r--r--tests/selenium/suites/PreviewPageTestCase.php53
-rw-r--r--tests/selenium/suites/SavePageTestCase.php58
-rw-r--r--tests/selenium/suites/SimpleSeleniumConfig.php30
-rw-r--r--tests/selenium/suites/SimpleSeleniumTestCase.php39
-rw-r--r--tests/selenium/suites/SimpleSeleniumTestSuite.php26
-rw-r--r--tests/selenium/suites/UserPreferencesTestCase.php179
-rw-r--r--tests/testHelpers.inc582
421 files changed, 0 insertions, 75727 deletions
diff --git a/tests/.htaccess b/tests/.htaccess
deleted file mode 100644
index 3a428827..00000000
--- a/tests/.htaccess
+++ /dev/null
@@ -1 +0,0 @@
-Deny from all
diff --git a/tests/RunSeleniumTests.php b/tests/RunSeleniumTests.php
deleted file mode 100644
index 28501eaa..00000000
--- a/tests/RunSeleniumTests.php
+++ /dev/null
@@ -1,233 +0,0 @@
-#!/usr/bin/php
-<?php
-/**
- * @file
- * @ingroup Maintenance
- * @copyright Copyright © Wikimedia Deuschland, 2009
- * @author Hallo Welt! Medienwerkstatt GmbH
- * @author Markus Glaser, Dan Nessett, Priyanka Dhanda
- * initial idea by Daniel Kinzler
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-$IP = dirname( __DIR__ );
-
-define( 'SELENIUMTEST', true );
-
-//require_once( __DIR__ . '/../maintenance/commandLine.inc' );
-require( __DIR__ . '/../maintenance/Maintenance.php' );
-
-require_once( 'PHPUnit/Runner/Version.php' );
-if( version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '>=' ) ) {
- # PHPUnit 3.5.0 introduced a nice autoloader based on class name
- require_once( 'PHPUnit/Autoload.php' );
-} else {
- # Keep the old pre PHPUnit 3.5.0 behaviour for compatibility
- require_once( 'PHPUnit/TextUI/Command.php' );
-}
-
-require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
-include_once( 'PHPUnit/Util/Log/JUnit.php' );
-
-require_once( __DIR__ . "/selenium/SeleniumServerManager.php" );
-
-class SeleniumTester extends Maintenance {
- protected $selenium;
- protected $serverManager;
- protected $seleniumServerExecPath;
-
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Selenium Test Runner. For documentation, visit http://www.mediawiki.org/wiki/SeleniumFramework";
- $this->addOption( 'port', 'Port used by selenium server. Default: 4444', false, true );
- $this->addOption( 'host', 'Host selenium server. Default: $wgServer . $wgScriptPath', false, true );
- $this->addOption( 'testBrowser', 'The browser used during testing. Default: firefox', false, true );
- $this->addOption( 'wikiUrl', 'The Mediawiki installation to point to. Default: http://localhost', false, true );
- $this->addOption( 'username', 'The login username for sunning tests. Default: empty', false, true );
- $this->addOption( 'userPassword', 'The login password for running tests. Default: empty', false, true );
- $this->addOption( 'seleniumConfig', 'Location of the selenium config file. Default: empty', false, true );
- $this->addOption( 'list-browsers', 'List the available browsers.' );
- $this->addOption( 'verbose', 'Be noisier.' );
- $this->addOption( 'startserver', 'Start Selenium Server (on localhost) before the run.' );
- $this->addOption( 'stopserver', 'Stop Selenium Server (on localhost) after the run.' );
- $this->addOption( 'jUnitLogFile', 'Log results in a specified JUnit log file. Default: empty', false, true );
- $this->addOption( 'runAgainstGrid', 'The test will be run against a Selenium Grid. Default: false.', false, true );
- $this->deleteOption( 'dbpass' );
- $this->deleteOption( 'dbuser' );
- $this->deleteOption( 'globals' );
- $this->deleteOption( 'wiki' );
- }
-
- public function listBrowsers() {
- $desc = "Available browsers:\n";
-
- foreach ($this->selenium->getAvailableBrowsers() as $k => $v) {
- $desc .= " $k => $v\n";
- }
-
- echo $desc;
- }
-
- protected function startServer() {
- if ( $this->seleniumServerExecPath == '' ) {
- die ( "The selenium server exec path is not set in " .
- "selenium_settings.ini. Cannot start server \n" .
- "as requested - terminating RunSeleniumTests\n" );
- }
- $this->serverManager = new SeleniumServerManager( 'true',
- $this->selenium->getPort(),
- $this->seleniumServerExecPath );
- switch ( $this->serverManager->start() ) {
- case 'started':
- break;
- case 'failed':
- die ( "Unable to start the Selenium Server - " .
- "terminating RunSeleniumTests\n" );
- case 'running':
- echo ( "Warning: The Selenium Server is " .
- "already running\n" );
- break;
- }
-
- return;
- }
-
- protected function stopServer() {
- if ( !isset ( $this->serverManager ) ) {
- echo ( "Warning: Request to stop Selenium Server, but it was " .
- "not stared by RunSeleniumTests\n" .
- "RunSeleniumTests cannot stop a Selenium Server it " .
- "did not start\n" );
- } else {
- switch ( $this->serverManager->stop() ) {
- case 'stopped':
- break;
- case 'failed':
- echo ( "unable to stop the Selenium Server\n" );
- }
- }
- return;
- }
-
- protected function runTests( $seleniumTestSuites = array() ) {
- $result = new PHPUnit_Framework_TestResult;
- $result->addListener( new SeleniumTestListener( $this->selenium->getLogger() ) );
- if ( $this->selenium->getJUnitLogFile() ) {
- $jUnitListener = new PHPUnit_Util_Log_JUnit( $this->selenium->getJUnitLogFile(), true );
- $result->addListener( $jUnitListener );
- }
-
- foreach ( $seleniumTestSuites as $testSuiteName => $testSuiteFile ) {
- require( $testSuiteFile );
- $suite = new $testSuiteName();
- $suite->setName( $testSuiteName );
- $suite->addTests();
-
- try {
- $suite->run( $result );
- } catch ( Testing_Selenium_Exception $e ) {
- $suite->tearDown();
- throw new MWException( $e->getMessage() );
- }
- }
-
- if ( $this->selenium->getJUnitLogFile() ) {
- $jUnitListener->flush();
- }
- }
-
- public function execute() {
- global $wgServer, $wgScriptPath, $wgHooks;
-
- $seleniumSettings = array();
- $seleniumBrowsers = array();
- $seleniumTestSuites = array();
-
- $configFile = $this->getOption( 'seleniumConfig', '' );
- if ( strlen( $configFile ) > 0 ) {
- $this->output("Using Selenium Configuration file: " . $configFile . "\n");
- SeleniumConfig::getSeleniumSettings( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites,
- $configFile );
- } elseif ( !isset( $wgHooks['SeleniumSettings'] ) ) {
- $this->output("No command line, configuration file or configuration hook found.\n");
- SeleniumConfig::getSeleniumSettings( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites
- );
- } else {
- $this->output("Using 'SeleniumSettings' hook for configuration.\n");
- wfRunHooks('SeleniumSettings', array( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites ) );
- }
-
- // State for starting/stopping the Selenium server has nothing to do with the Selenium
- // class. Keep this state local to SeleniumTester class. Using getOption() is clumsy, but
- // the Maintenance class does not have a setOption()
- if ( ! isset( $seleniumSettings['startserver'] ) ) $this->getOption( 'startserver', true );
- if ( ! isset( $seleniumSettings['stopserver'] ) ) $this->getOption( 'stopserver', true );
- if ( !isset( $seleniumSettings['seleniumserverexecpath'] ) ) $seleniumSettings['seleniumserverexecpath'] = '';
- $this->seleniumServerExecPath = $seleniumSettings['seleniumserverexecpath'];
-
- //set reasonable defaults if we did not find the settings
- if ( !isset( $seleniumBrowsers ) ) $seleniumBrowsers = array ('firefox' => '*firefox');
- if ( !isset( $seleniumSettings['host'] ) ) $seleniumSettings['host'] = $wgServer . $wgScriptPath;
- if ( !isset( $seleniumSettings['port'] ) ) $seleniumSettings['port'] = '4444';
- if ( !isset( $seleniumSettings['wikiUrl'] ) ) $seleniumSettings['wikiUrl'] = 'http://localhost';
- if ( !isset( $seleniumSettings['username'] ) ) $seleniumSettings['username'] = '';
- if ( !isset( $seleniumSettings['userPassword'] ) ) $seleniumSettings['userPassword'] = '';
- if ( !isset( $seleniumSettings['testBrowser'] ) ) $seleniumSettings['testBrowser'] = 'firefox';
- if ( !isset( $seleniumSettings['jUnitLogFile'] ) ) $seleniumSettings['jUnitLogFile'] = false;
- if ( !isset( $seleniumSettings['runAgainstGrid'] ) ) $seleniumSettings['runAgainstGrid'] = false;
-
- // Setup Selenium class
- $this->selenium = new Selenium( );
- $this->selenium->setAvailableBrowsers( $seleniumBrowsers );
- $this->selenium->setRunAgainstGrid( $this->getOption( 'runAgainstGrid', $seleniumSettings['runAgainstGrid'] ) );
- $this->selenium->setUrl( $this->getOption( 'wikiUrl', $seleniumSettings['wikiUrl'] ) );
- $this->selenium->setBrowser( $this->getOption( 'testBrowser', $seleniumSettings['testBrowser'] ) );
- $this->selenium->setPort( $this->getOption( 'port', $seleniumSettings['port'] ) );
- $this->selenium->setHost( $this->getOption( 'host', $seleniumSettings['host'] ) );
- $this->selenium->setUser( $this->getOption( 'username', $seleniumSettings['username'] ) );
- $this->selenium->setPass( $this->getOption( 'userPassword', $seleniumSettings['userPassword'] ) );
- $this->selenium->setVerbose( $this->hasOption( 'verbose' ) );
- $this->selenium->setJUnitLogFile( $this->getOption( 'jUnitLogFile', $seleniumSettings['jUnitLogFile'] ) );
-
- if( $this->hasOption( 'list-browsers' ) ) {
- $this->listBrowsers();
- exit(0);
- }
- if ( $this->hasOption( 'startserver' ) ) {
- $this->startServer();
- }
-
- $logger = new SeleniumTestConsoleLogger;
- $this->selenium->setLogger( $logger );
-
- $this->runTests( $seleniumTestSuites );
-
- if ( $this->hasOption( 'stopserver' ) ) {
- $this->stopServer();
- }
- }
-}
-
-$maintClass = "SeleniumTester";
-
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/tests/TestsAutoLoader.php b/tests/TestsAutoLoader.php
deleted file mode 100644
index 42f5f68a..00000000
--- a/tests/TestsAutoLoader.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-global $wgAutoloadClasses;
-$testFolder = __DIR__;
-
-$wgAutoloadClasses += array(
-
- //PHPUnit
- 'MediaWikiTestCase' => "$testFolder/phpunit/MediaWikiTestCase.php",
- 'MediaWikiPHPUnitCommand' => "$testFolder/phpunit/MediaWikiPHPUnitCommand.php",
- 'MediaWikiLangTestCase' => "$testFolder/phpunit/MediaWikiLangTestCase.php",
- 'NewParserTest' => "$testFolder/phpunit/includes/parser/NewParserTest.php",
-
- //includes
- 'BlockTest' => "$testFolder/phpunit/includes/BlockTest.php",
-
- //API
- 'ApiFormatTestBase' => "$testFolder/phpunit/includes/api/format/ApiFormatTestBase.php",
- 'ApiTestCase' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
- 'TestUser' => "$testFolder/phpunit/includes/TestUser.php",
- 'MockApi' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
- 'RandomImageGenerator' => "$testFolder/phpunit/includes/api/RandomImageGenerator.php",
- 'UserWrapper' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
-
- //Selenium
- 'SeleniumTestConstants' => "$testFolder/selenium/SeleniumTestConstants.php",
-
- //maintenance
- 'DumpTestCase' => "$testFolder/phpunit/maintenance/DumpTestCase.php",
- 'BackupDumper' => "$testFolder/../maintenance/backup.inc",
-
- //Generic providers
- 'MediaWikiProvide' => "$testFolder/phpunit/includes/Providers.php",
-);
-
diff --git a/tests/jasmine/.htaccess b/tests/jasmine/.htaccess
deleted file mode 100644
index 605d2f4c..00000000
--- a/tests/jasmine/.htaccess
+++ /dev/null
@@ -1 +0,0 @@
-Allow from all
diff --git a/tests/jasmine/SpecRunner.html b/tests/jasmine/SpecRunner.html
deleted file mode 100644
index 63d0fdfa..00000000
--- a/tests/jasmine/SpecRunner.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html lang="en" dir="ltr">
- <head>
- <title>Jasmine Test Runner</title>
- <meta charset="UTF-8" />
- <link rel="stylesheet" type="text/css" href="lib/jasmine-1.0.1/jasmine.css">
- <script src="lib/jasmine-1.0.1/jasmine.js"></script>
- <script src="lib/jasmine-1.0.1/jasmine-html.js"></script>
-
- <!-- include source files here... -->
- <script src="../../load.php?debug=true&amp;lang=en&amp;modules=startup&amp;only=scripts&amp;skin=vector&amp;*"></script>
- <script>
- mw.loader.load( ['mediawiki.jqueryMsg'] );
- </script>
-
- <!-- insert test data files here -->
- <script src="spec/mediawiki.jqueryMsg.spec.data.js"></script>
-
- <!-- include spec files here... -->
- <script src="spec/mediawiki.jqueryMsg.spec.js"></script>
- </head>
-<body>
- <script>
- jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );
- jasmine.getEnv().execute();
- </script>
-</body>
-</html>
diff --git a/tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE b/tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE
deleted file mode 100644
index 1eb9b49e..00000000
--- a/tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2008-2010 Pivotal Labs
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js b/tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js
deleted file mode 100644
index 81402b9c..00000000
--- a/tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js
+++ /dev/null
@@ -1,188 +0,0 @@
-jasmine.TrivialReporter = function(doc) {
- this.document = doc || document;
- this.suiteDivs = {};
- this.logRunningSpecs = false;
-};
-
-jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
- var el = document.createElement(type);
-
- for (var i = 2; i < arguments.length; i++) {
- var child = arguments[i];
-
- if (typeof child === 'string') {
- el.appendChild(document.createTextNode(child));
- } else {
- if (child) { el.appendChild(child); }
- }
- }
-
- for (var attr in attrs) {
- if (attr == "className") {
- el[attr] = attrs[attr];
- } else {
- el.setAttribute(attr, attrs[attr]);
- }
- }
-
- return el;
-};
-
-jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
- var showPassed, showSkipped;
-
- this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
- this.createDom('div', { className: 'banner' },
- this.createDom('div', { className: 'logo' },
- this.createDom('a', { href: 'http://pivotal.github.com/jasmine/', target: "_blank" }, "Jasmine"),
- this.createDom('span', { className: 'version' }, runner.env.versionString())),
- this.createDom('div', { className: 'options' },
- "Show ",
- showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
- this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
- showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
- this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
- )
- ),
-
- this.runnerDiv = this.createDom('div', { className: 'runner running' },
- this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
- this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
- this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
- );
-
- this.document.body.appendChild(this.outerDiv);
-
- var suites = runner.suites();
- for (var i = 0; i < suites.length; i++) {
- var suite = suites[i];
- var suiteDiv = this.createDom('div', { className: 'suite' },
- this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
- this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
- this.suiteDivs[suite.id] = suiteDiv;
- var parentDiv = this.outerDiv;
- if (suite.parentSuite) {
- parentDiv = this.suiteDivs[suite.parentSuite.id];
- }
- parentDiv.appendChild(suiteDiv);
- }
-
- this.startedAt = new Date();
-
- var self = this;
- showPassed.onclick = function(evt) {
- if (showPassed.checked) {
- self.outerDiv.className += ' show-passed';
- } else {
- self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
- }
- };
-
- showSkipped.onclick = function(evt) {
- if (showSkipped.checked) {
- self.outerDiv.className += ' show-skipped';
- } else {
- self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
- }
- };
-};
-
-jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
- var results = runner.results();
- var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
- this.runnerDiv.setAttribute("class", className);
- //do it twice for IE
- this.runnerDiv.setAttribute("className", className);
- var specs = runner.specs();
- var specCount = 0;
- for (var i = 0; i < specs.length; i++) {
- if (this.specFilter(specs[i])) {
- specCount++;
- }
- }
- var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
- message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
- this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
-
- this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
-};
-
-jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
- var results = suite.results();
- var status = results.passed() ? 'passed' : 'failed';
- if (results.totalCount == 0) { // todo: change this to check results.skipped
- status = 'skipped';
- }
- this.suiteDivs[suite.id].className += " " + status;
-};
-
-jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
- if (this.logRunningSpecs) {
- this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
- }
-};
-
-jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
- var results = spec.results();
- var status = results.passed() ? 'passed' : 'failed';
- if (results.skipped) {
- status = 'skipped';
- }
- var specDiv = this.createDom('div', { className: 'spec ' + status },
- this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
- this.createDom('a', {
- className: 'description',
- href: '?spec=' + encodeURIComponent(spec.getFullName()),
- title: spec.getFullName()
- }, spec.description));
-
-
- var resultItems = results.getItems();
- var messagesDiv = this.createDom('div', { className: 'messages' });
- for (var i = 0; i < resultItems.length; i++) {
- var result = resultItems[i];
-
- if (result.type == 'log') {
- messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
- } else if (result.type == 'expect' && result.passed && !result.passed()) {
- messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
-
- if (result.trace.stack) {
- messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
- }
- }
- }
-
- if (messagesDiv.childNodes.length > 0) {
- specDiv.appendChild(messagesDiv);
- }
-
- this.suiteDivs[spec.suite.id].appendChild(specDiv);
-};
-
-jasmine.TrivialReporter.prototype.log = function() {
- var console = jasmine.getGlobal().console;
- if (console && console.log) {
- if (console.log.apply) {
- console.log.apply(console, arguments);
- } else {
- console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
- }
- }
-};
-
-jasmine.TrivialReporter.prototype.getLocation = function() {
- return this.document.location;
-};
-
-jasmine.TrivialReporter.prototype.specFilter = function(spec) {
- var paramMap = {};
- var params = this.getLocation().search.substring(1).split('&');
- for (var i = 0; i < params.length; i++) {
- var p = params[i].split('=');
- paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
- }
-
- if (!paramMap["spec"]) return true;
- return spec.getFullName().indexOf(paramMap["spec"]) == 0;
-};
diff --git a/tests/jasmine/lib/jasmine-1.0.1/jasmine.css b/tests/jasmine/lib/jasmine-1.0.1/jasmine.css
deleted file mode 100644
index 6583fe7c..00000000
--- a/tests/jasmine/lib/jasmine-1.0.1/jasmine.css
+++ /dev/null
@@ -1,166 +0,0 @@
-body {
- font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif;
-}
-
-
-.jasmine_reporter a:visited, .jasmine_reporter a {
- color: #303;
-}
-
-.jasmine_reporter a:hover, .jasmine_reporter a:active {
- color: blue;
-}
-
-.run_spec {
- float:right;
- padding-right: 5px;
- font-size: .8em;
- text-decoration: none;
-}
-
-.jasmine_reporter {
- margin: 0 5px;
-}
-
-.banner {
- color: #303;
- background-color: #fef;
- padding: 5px;
-}
-
-.logo {
- float: left;
- font-size: 1.1em;
- padding-left: 5px;
-}
-
-.logo .version {
- font-size: .6em;
- padding-left: 1em;
-}
-
-.runner.running {
- background-color: yellow;
-}
-
-
-.options {
- text-align: right;
- font-size: .8em;
-}
-
-
-
-
-.suite {
- border: 1px outset gray;
- margin: 5px 0;
- padding-left: 1em;
-}
-
-.suite .suite {
- margin: 5px;
-}
-
-.suite.passed {
- background-color: #dfd;
-}
-
-.suite.failed {
- background-color: #fdd;
-}
-
-.spec {
- margin: 5px;
- padding-left: 1em;
- clear: both;
-}
-
-.spec.failed, .spec.passed, .spec.skipped {
- padding-bottom: 5px;
- border: 1px solid gray;
-}
-
-.spec.failed {
- background-color: #fbb;
- border-color: red;
-}
-
-.spec.passed {
- background-color: #bfb;
- border-color: green;
-}
-
-.spec.skipped {
- background-color: #bbb;
-}
-
-.messages {
- border-left: 1px dashed gray;
- padding-left: 1em;
- padding-right: 1em;
-}
-
-.passed {
- background-color: #cfc;
- display: none;
-}
-
-.failed {
- background-color: #fbb;
-}
-
-.skipped {
- color: #777;
- background-color: #eee;
- display: none;
-}
-
-
-/*.resultMessage {*/
- /*white-space: pre;*/
-/*}*/
-
-.resultMessage span.result {
- display: block;
- line-height: 2em;
- color: black;
-}
-
-.resultMessage .mismatch {
- color: black;
-}
-
-.stackTrace {
- white-space: pre;
- font-size: .8em;
- margin-left: 10px;
- max-height: 5em;
- overflow: auto;
- border: 1px inset red;
- padding: 1em;
- background: #eef;
-}
-
-.finished-at {
- padding-left: 1em;
- font-size: .6em;
-}
-
-.show-passed .passed,
-.show-skipped .skipped {
- display: block;
-}
-
-
-#jasmine_content {
- position:fixed;
- right: 100%;
-}
-
-.runner {
- border: 1px solid gray;
- display: block;
- margin: 5px 0;
- padding: 2px 0 2px 10px;
-}
diff --git a/tests/jasmine/lib/jasmine-1.0.1/jasmine.js b/tests/jasmine/lib/jasmine-1.0.1/jasmine.js
deleted file mode 100644
index 964f99ed..00000000
--- a/tests/jasmine/lib/jasmine-1.0.1/jasmine.js
+++ /dev/null
@@ -1,2421 +0,0 @@
-/**
- * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.
- *
- * @namespace
- */
-var jasmine = {};
-
-/**
- * @private
- */
-jasmine.unimplementedMethod_ = function() {
- throw new Error("unimplemented method");
-};
-
-/**
- * Use <code>jasmine.undefined</code> instead of <code>undefined</code>, since <code>undefined</code> is just
- * a plain old variable and may be redefined by somebody else.
- *
- * @private
- */
-jasmine.undefined = jasmine.___undefined___;
-
-/**
- * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed.
- *
- */
-jasmine.DEFAULT_UPDATE_INTERVAL = 250;
-
-/**
- * Default timeout interval in milliseconds for waitsFor() blocks.
- */
-jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
-
-jasmine.getGlobal = function() {
- function getGlobal() {
- return this;
- }
-
- return getGlobal();
-};
-
-/**
- * Allows for bound functions to be compared. Internal use only.
- *
- * @ignore
- * @private
- * @param base {Object} bound 'this' for the function
- * @param name {Function} function to find
- */
-jasmine.bindOriginal_ = function(base, name) {
- var original = base[name];
- if (original.apply) {
- return function() {
- return original.apply(base, arguments);
- };
- } else {
- // IE support
- return jasmine.getGlobal()[name];
- }
-};
-
-jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout');
-jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout');
-jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval');
-jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval');
-
-jasmine.MessageResult = function(values) {
- this.type = 'log';
- this.values = values;
- this.trace = new Error(); // todo: test better
-};
-
-jasmine.MessageResult.prototype.toString = function() {
- var text = "";
- for(var i = 0; i < this.values.length; i++) {
- if (i > 0) text += " ";
- if (jasmine.isString_(this.values[i])) {
- text += this.values[i];
- } else {
- text += jasmine.pp(this.values[i]);
- }
- }
- return text;
-};
-
-jasmine.ExpectationResult = function(params) {
- this.type = 'expect';
- this.matcherName = params.matcherName;
- this.passed_ = params.passed;
- this.expected = params.expected;
- this.actual = params.actual;
-
- this.message = this.passed_ ? 'Passed.' : params.message;
- this.trace = this.passed_ ? '' : new Error(this.message);
-};
-
-jasmine.ExpectationResult.prototype.toString = function () {
- return this.message;
-};
-
-jasmine.ExpectationResult.prototype.passed = function () {
- return this.passed_;
-};
-
-/**
- * Getter for the Jasmine environment. Ensures one gets created
- */
-jasmine.getEnv = function() {
- return jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env();
-};
-
-/**
- * @ignore
- * @private
- * @param value
- * @returns {Boolean}
- */
-jasmine.isArray_ = function(value) {
- return jasmine.isA_("Array", value);
-};
-
-/**
- * @ignore
- * @private
- * @param value
- * @returns {Boolean}
- */
-jasmine.isString_ = function(value) {
- return jasmine.isA_("String", value);
-};
-
-/**
- * @ignore
- * @private
- * @param value
- * @returns {Boolean}
- */
-jasmine.isNumber_ = function(value) {
- return jasmine.isA_("Number", value);
-};
-
-/**
- * @ignore
- * @private
- * @param {String} typeName
- * @param value
- * @returns {Boolean}
- */
-jasmine.isA_ = function(typeName, value) {
- return Object.prototype.toString.apply(value) === '[object ' + typeName + ']';
-};
-
-/**
- * Pretty printer for expecations. Takes any object and turns it into a human-readable string.
- *
- * @param value {Object} an object to be outputted
- * @returns {String}
- */
-jasmine.pp = function(value) {
- var stringPrettyPrinter = new jasmine.StringPrettyPrinter();
- stringPrettyPrinter.format(value);
- return stringPrettyPrinter.string;
-};
-
-/**
- * Returns true if the object is a DOM Node.
- *
- * @param {Object} obj object to check
- * @returns {Boolean}
- */
-jasmine.isDomNode = function(obj) {
- return obj['nodeType'] > 0;
-};
-
-/**
- * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter.
- *
- * @example
- * // don't care about which function is passed in, as long as it's a function
- * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function));
- *
- * @param {Class} clazz
- * @returns matchable object of the type clazz
- */
-jasmine.any = function(clazz) {
- return new jasmine.Matchers.Any(clazz);
-};
-
-/**
- * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks.
- *
- * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine
- * expectation syntax. Spies can be checked if they were called or not and what the calling params were.
- *
- * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs).
- *
- * Spies are torn down at the end of every spec.
- *
- * Note: Do <b>not</b> call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj.
- *
- * @example
- * // a stub
- * var myStub = jasmine.createSpy('myStub'); // can be used anywhere
- *
- * // spy example
- * var foo = {
- * not: function(bool) { return !bool; }
- * }
- *
- * // actual foo.not will not be called, execution stops
- * spyOn(foo, 'not');
-
- // foo.not spied upon, execution will continue to implementation
- * spyOn(foo, 'not').andCallThrough();
- *
- * // fake example
- * var foo = {
- * not: function(bool) { return !bool; }
- * }
- *
- * // foo.not(val) will return val
- * spyOn(foo, 'not').andCallFake(function(value) {return value;});
- *
- * // mock example
- * foo.not(7 == 7);
- * expect(foo.not).toHaveBeenCalled();
- * expect(foo.not).toHaveBeenCalledWith(true);
- *
- * @constructor
- * @see spyOn, jasmine.createSpy, jasmine.createSpyObj
- * @param {String} name
- */
-jasmine.Spy = function(name) {
- /**
- * The name of the spy, if provided.
- */
- this.identity = name || 'unknown';
- /**
- * Is this Object a spy?
- */
- this.isSpy = true;
- /**
- * The actual function this spy stubs.
- */
- this.plan = function() {
- };
- /**
- * Tracking of the most recent call to the spy.
- * @example
- * var mySpy = jasmine.createSpy('foo');
- * mySpy(1, 2);
- * mySpy.mostRecentCall.args = [1, 2];
- */
- this.mostRecentCall = {};
-
- /**
- * Holds arguments for each call to the spy, indexed by call count
- * @example
- * var mySpy = jasmine.createSpy('foo');
- * mySpy(1, 2);
- * mySpy(7, 8);
- * mySpy.mostRecentCall.args = [7, 8];
- * mySpy.argsForCall[0] = [1, 2];
- * mySpy.argsForCall[1] = [7, 8];
- */
- this.argsForCall = [];
- this.calls = [];
-};
-
-/**
- * Tells a spy to call through to the actual implemenatation.
- *
- * @example
- * var foo = {
- * bar: function() { // do some stuff }
- * }
- *
- * // defining a spy on an existing property: foo.bar
- * spyOn(foo, 'bar').andCallThrough();
- */
-jasmine.Spy.prototype.andCallThrough = function() {
- this.plan = this.originalValue;
- return this;
-};
-
-/**
- * For setting the return value of a spy.
- *
- * @example
- * // defining a spy from scratch: foo() returns 'baz'
- * var foo = jasmine.createSpy('spy on foo').andReturn('baz');
- *
- * // defining a spy on an existing property: foo.bar() returns 'baz'
- * spyOn(foo, 'bar').andReturn('baz');
- *
- * @param {Object} value
- */
-jasmine.Spy.prototype.andReturn = function(value) {
- this.plan = function() {
- return value;
- };
- return this;
-};
-
-/**
- * For throwing an exception when a spy is called.
- *
- * @example
- * // defining a spy from scratch: foo() throws an exception w/ message 'ouch'
- * var foo = jasmine.createSpy('spy on foo').andThrow('baz');
- *
- * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch'
- * spyOn(foo, 'bar').andThrow('baz');
- *
- * @param {String} exceptionMsg
- */
-jasmine.Spy.prototype.andThrow = function(exceptionMsg) {
- this.plan = function() {
- throw exceptionMsg;
- };
- return this;
-};
-
-/**
- * Calls an alternate implementation when a spy is called.
- *
- * @example
- * var baz = function() {
- * // do some stuff, return something
- * }
- * // defining a spy from scratch: foo() calls the function baz
- * var foo = jasmine.createSpy('spy on foo').andCall(baz);
- *
- * // defining a spy on an existing property: foo.bar() calls an anonymnous function
- * spyOn(foo, 'bar').andCall(function() { return 'baz';} );
- *
- * @param {Function} fakeFunc
- */
-jasmine.Spy.prototype.andCallFake = function(fakeFunc) {
- this.plan = fakeFunc;
- return this;
-};
-
-/**
- * Resets all of a spy's the tracking variables so that it can be used again.
- *
- * @example
- * spyOn(foo, 'bar');
- *
- * foo.bar();
- *
- * expect(foo.bar.callCount).toEqual(1);
- *
- * foo.bar.reset();
- *
- * expect(foo.bar.callCount).toEqual(0);
- */
-jasmine.Spy.prototype.reset = function() {
- this.wasCalled = false;
- this.callCount = 0;
- this.argsForCall = [];
- this.calls = [];
- this.mostRecentCall = {};
-};
-
-jasmine.createSpy = function(name) {
-
- var spyObj = function() {
- spyObj.wasCalled = true;
- spyObj.callCount++;
- var args = jasmine.util.argsToArray(arguments);
- spyObj.mostRecentCall.object = this;
- spyObj.mostRecentCall.args = args;
- spyObj.argsForCall.push(args);
- spyObj.calls.push({object: this, args: args});
- return spyObj.plan.apply(this, arguments);
- };
-
- var spy = new jasmine.Spy(name);
-
- for (var prop in spy) {
- spyObj[prop] = spy[prop];
- }
-
- spyObj.reset();
-
- return spyObj;
-};
-
-/**
- * Determines whether an object is a spy.
- *
- * @param {jasmine.Spy|Object} putativeSpy
- * @returns {Boolean}
- */
-jasmine.isSpy = function(putativeSpy) {
- return putativeSpy && putativeSpy.isSpy;
-};
-
-/**
- * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something
- * large in one call.
- *
- * @param {String} baseName name of spy class
- * @param {Array} methodNames array of names of methods to make spies
- */
-jasmine.createSpyObj = function(baseName, methodNames) {
- if (!jasmine.isArray_(methodNames) || methodNames.length == 0) {
- throw new Error('createSpyObj requires a non-empty array of method names to create spies for');
- }
- var obj = {};
- for (var i = 0; i < methodNames.length; i++) {
- obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]);
- }
- return obj;
-};
-
-/**
- * All parameters are pretty-printed and concatenated together, then written to the current spec's output.
- *
- * Be careful not to leave calls to <code>jasmine.log</code> in production code.
- */
-jasmine.log = function() {
- var spec = jasmine.getEnv().currentSpec;
- spec.log.apply(spec, arguments);
-};
-
-/**
- * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy.
- *
- * @example
- * // spy example
- * var foo = {
- * not: function(bool) { return !bool; }
- * }
- * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops
- *
- * @see jasmine.createSpy
- * @param obj
- * @param methodName
- * @returns a Jasmine spy that can be chained with all spy methods
- */
-var spyOn = function(obj, methodName) {
- return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
-};
-
-/**
- * Creates a Jasmine spec that will be added to the current suite.
- *
- * // TODO: pending tests
- *
- * @example
- * it('should be true', function() {
- * expect(true).toEqual(true);
- * });
- *
- * @param {String} desc description of this specification
- * @param {Function} func defines the preconditions and expectations of the spec
- */
-var it = function(desc, func) {
- return jasmine.getEnv().it(desc, func);
-};
-
-/**
- * Creates a <em>disabled</em> Jasmine spec.
- *
- * A convenience method that allows existing specs to be disabled temporarily during development.
- *
- * @param {String} desc description of this specification
- * @param {Function} func defines the preconditions and expectations of the spec
- */
-var xit = function(desc, func) {
- return jasmine.getEnv().xit(desc, func);
-};
-
-/**
- * Starts a chain for a Jasmine expectation.
- *
- * It is passed an Object that is the actual value and should chain to one of the many
- * jasmine.Matchers functions.
- *
- * @param {Object} actual Actual value to test against and expected value
- */
-var expect = function(actual) {
- return jasmine.getEnv().currentSpec.expect(actual);
-};
-
-/**
- * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs.
- *
- * @param {Function} func Function that defines part of a jasmine spec.
- */
-var runs = function(func) {
- jasmine.getEnv().currentSpec.runs(func);
-};
-
-/**
- * Waits a fixed time period before moving to the next block.
- *
- * @deprecated Use waitsFor() instead
- * @param {Number} timeout milliseconds to wait
- */
-var waits = function(timeout) {
- jasmine.getEnv().currentSpec.waits(timeout);
-};
-
-/**
- * Waits for the latchFunction to return true before proceeding to the next block.
- *
- * @param {Function} latchFunction
- * @param {String} optional_timeoutMessage
- * @param {Number} optional_timeout
- */
-var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
- jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments);
-};
-
-/**
- * A function that is called before each spec in a suite.
- *
- * Used for spec setup, including validating assumptions.
- *
- * @param {Function} beforeEachFunction
- */
-var beforeEach = function(beforeEachFunction) {
- jasmine.getEnv().beforeEach(beforeEachFunction);
-};
-
-/**
- * A function that is called after each spec in a suite.
- *
- * Used for restoring any state that is hijacked during spec execution.
- *
- * @param {Function} afterEachFunction
- */
-var afterEach = function(afterEachFunction) {
- jasmine.getEnv().afterEach(afterEachFunction);
-};
-
-/**
- * Defines a suite of specifications.
- *
- * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared
- * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization
- * of setup in some tests.
- *
- * @example
- * // TODO: a simple suite
- *
- * // TODO: a simple suite with a nested describe block
- *
- * @param {String} description A string, usually the class under test.
- * @param {Function} specDefinitions function that defines several specs.
- */
-var describe = function(description, specDefinitions) {
- return jasmine.getEnv().describe(description, specDefinitions);
-};
-
-/**
- * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development.
- *
- * @param {String} description A string, usually the class under test.
- * @param {Function} specDefinitions function that defines several specs.
- */
-var xdescribe = function(description, specDefinitions) {
- return jasmine.getEnv().xdescribe(description, specDefinitions);
-};
-
-
-// Provide the XMLHttpRequest class for IE 5.x-6.x:
-jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() {
- try {
- return new ActiveXObject("Msxml2.XMLHTTP.6.0");
- } catch(e) {
- }
- try {
- return new ActiveXObject("Msxml2.XMLHTTP.3.0");
- } catch(e) {
- }
- try {
- return new ActiveXObject("Msxml2.XMLHTTP");
- } catch(e) {
- }
- try {
- return new ActiveXObject("Microsoft.XMLHTTP");
- } catch(e) {
- }
- throw new Error("This browser does not support XMLHttpRequest.");
-} : XMLHttpRequest;
-/**
- * @namespace
- */
-jasmine.util = {};
-
-/**
- * Declare that a child class inherit it's prototype from the parent class.
- *
- * @private
- * @param {Function} childClass
- * @param {Function} parentClass
- */
-jasmine.util.inherit = function(childClass, parentClass) {
- /**
- * @private
- */
- var subclass = function() {
- };
- subclass.prototype = parentClass.prototype;
- childClass.prototype = new subclass;
-};
-
-jasmine.util.formatException = function(e) {
- var lineNumber;
- if (e.line) {
- lineNumber = e.line;
- }
- else if (e.lineNumber) {
- lineNumber = e.lineNumber;
- }
-
- var file;
-
- if (e.sourceURL) {
- file = e.sourceURL;
- }
- else if (e.fileName) {
- file = e.fileName;
- }
-
- var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString();
-
- if (file && lineNumber) {
- message += ' in ' + file + ' (line ' + lineNumber + ')';
- }
-
- return message;
-};
-
-jasmine.util.htmlEscape = function(str) {
- if (!str) return str;
- return str.replace(/&/g, '&amp;')
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;');
-};
-
-jasmine.util.argsToArray = function(args) {
- var arrayOfArgs = [];
- for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]);
- return arrayOfArgs;
-};
-
-jasmine.util.extend = function(destination, source) {
- for (var property in source) destination[property] = source[property];
- return destination;
-};
-
-/**
- * Environment for Jasmine
- *
- * @constructor
- */
-jasmine.Env = function() {
- this.currentSpec = null;
- this.currentSuite = null;
- this.currentRunner_ = new jasmine.Runner(this);
-
- this.reporter = new jasmine.MultiReporter();
-
- this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL;
- this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL;
- this.lastUpdate = 0;
- this.specFilter = function() {
- return true;
- };
-
- this.nextSpecId_ = 0;
- this.nextSuiteId_ = 0;
- this.equalityTesters_ = [];
-
- // wrap matchers
- this.matchersClass = function() {
- jasmine.Matchers.apply(this, arguments);
- };
- jasmine.util.inherit(this.matchersClass, jasmine.Matchers);
-
- jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass);
-};
-
-
-jasmine.Env.prototype.setTimeout = jasmine.setTimeout;
-jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout;
-jasmine.Env.prototype.setInterval = jasmine.setInterval;
-jasmine.Env.prototype.clearInterval = jasmine.clearInterval;
-
-/**
- * @returns an object containing jasmine version build info, if set.
- */
-jasmine.Env.prototype.version = function () {
- if (jasmine.version_) {
- return jasmine.version_;
- } else {
- throw new Error('Version not set');
- }
-};
-
-/**
- * @returns string containing jasmine version build info, if set.
- */
-jasmine.Env.prototype.versionString = function() {
- if (jasmine.version_) {
- var version = this.version();
- return version.major + "." + version.minor + "." + version.build + " revision " + version.revision;
- } else {
- return "version unknown";
- }
-};
-
-/**
- * @returns a sequential integer starting at 0
- */
-jasmine.Env.prototype.nextSpecId = function () {
- return this.nextSpecId_++;
-};
-
-/**
- * @returns a sequential integer starting at 0
- */
-jasmine.Env.prototype.nextSuiteId = function () {
- return this.nextSuiteId_++;
-};
-
-/**
- * Register a reporter to receive status updates from Jasmine.
- * @param {jasmine.Reporter} reporter An object which will receive status updates.
- */
-jasmine.Env.prototype.addReporter = function(reporter) {
- this.reporter.addReporter(reporter);
-};
-
-jasmine.Env.prototype.execute = function() {
- this.currentRunner_.execute();
-};
-
-jasmine.Env.prototype.describe = function(description, specDefinitions) {
- var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite);
-
- var parentSuite = this.currentSuite;
- if (parentSuite) {
- parentSuite.add(suite);
- } else {
- this.currentRunner_.add(suite);
- }
-
- this.currentSuite = suite;
-
- var declarationError = null;
- try {
- specDefinitions.call(suite);
- } catch(e) {
- declarationError = e;
- }
-
- this.currentSuite = parentSuite;
-
- if (declarationError) {
- this.it("encountered a declaration exception", function() {
- throw declarationError;
- });
- }
-
- return suite;
-};
-
-jasmine.Env.prototype.beforeEach = function(beforeEachFunction) {
- if (this.currentSuite) {
- this.currentSuite.beforeEach(beforeEachFunction);
- } else {
- this.currentRunner_.beforeEach(beforeEachFunction);
- }
-};
-
-jasmine.Env.prototype.currentRunner = function () {
- return this.currentRunner_;
-};
-
-jasmine.Env.prototype.afterEach = function(afterEachFunction) {
- if (this.currentSuite) {
- this.currentSuite.afterEach(afterEachFunction);
- } else {
- this.currentRunner_.afterEach(afterEachFunction);
- }
-
-};
-
-jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) {
- return {
- execute: function() {
- }
- };
-};
-
-jasmine.Env.prototype.it = function(description, func) {
- var spec = new jasmine.Spec(this, this.currentSuite, description);
- this.currentSuite.add(spec);
- this.currentSpec = spec;
-
- if (func) {
- spec.runs(func);
- }
-
- return spec;
-};
-
-jasmine.Env.prototype.xit = function(desc, func) {
- return {
- id: this.nextSpecId(),
- runs: function() {
- }
- };
-};
-
-jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) {
- if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) {
- return true;
- }
-
- a.__Jasmine_been_here_before__ = b;
- b.__Jasmine_been_here_before__ = a;
-
- var hasKey = function(obj, keyName) {
- return obj != null && obj[keyName] !== jasmine.undefined;
- };
-
- for (var property in b) {
- if (!hasKey(a, property) && hasKey(b, property)) {
- mismatchKeys.push("expected has key '" + property + "', but missing from actual.");
- }
- }
- for (property in a) {
- if (!hasKey(b, property) && hasKey(a, property)) {
- mismatchKeys.push("expected missing key '" + property + "', but present in actual.");
- }
- }
- for (property in b) {
- if (property == '__Jasmine_been_here_before__') continue;
- if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) {
- mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual.");
- }
- }
-
- if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) {
- mismatchValues.push("arrays were not the same length");
- }
-
- delete a.__Jasmine_been_here_before__;
- delete b.__Jasmine_been_here_before__;
- return (mismatchKeys.length == 0 && mismatchValues.length == 0);
-};
-
-jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) {
- mismatchKeys = mismatchKeys || [];
- mismatchValues = mismatchValues || [];
-
- for (var i = 0; i < this.equalityTesters_.length; i++) {
- var equalityTester = this.equalityTesters_[i];
- var result = equalityTester(a, b, this, mismatchKeys, mismatchValues);
- if (result !== jasmine.undefined) return result;
- }
-
- if (a === b) return true;
-
- if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) {
- return (a == jasmine.undefined && b == jasmine.undefined);
- }
-
- if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) {
- return a === b;
- }
-
- if (a instanceof Date && b instanceof Date) {
- return a.getTime() == b.getTime();
- }
-
- if (a instanceof jasmine.Matchers.Any) {
- return a.matches(b);
- }
-
- if (b instanceof jasmine.Matchers.Any) {
- return b.matches(a);
- }
-
- if (jasmine.isString_(a) && jasmine.isString_(b)) {
- return (a == b);
- }
-
- if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) {
- return (a == b);
- }
-
- if (typeof a === "object" && typeof b === "object") {
- return this.compareObjects_(a, b, mismatchKeys, mismatchValues);
- }
-
- //Straight check
- return (a === b);
-};
-
-jasmine.Env.prototype.contains_ = function(haystack, needle) {
- if (jasmine.isArray_(haystack)) {
- for (var i = 0; i < haystack.length; i++) {
- if (this.equals_(haystack[i], needle)) return true;
- }
- return false;
- }
- return haystack.indexOf(needle) >= 0;
-};
-
-jasmine.Env.prototype.addEqualityTester = function(equalityTester) {
- this.equalityTesters_.push(equalityTester);
-};
-/** No-op base class for Jasmine reporters.
- *
- * @constructor
- */
-jasmine.Reporter = function() {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportRunnerStarting = function(runner) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportRunnerResults = function(runner) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportSuiteResults = function(suite) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportSpecStarting = function(spec) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportSpecResults = function(spec) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.log = function(str) {
-};
-
-/**
- * Blocks are functions with executable code that make up a spec.
- *
- * @constructor
- * @param {jasmine.Env} env
- * @param {Function} func
- * @param {jasmine.Spec} spec
- */
-jasmine.Block = function(env, func, spec) {
- this.env = env;
- this.func = func;
- this.spec = spec;
-};
-
-jasmine.Block.prototype.execute = function(onComplete) {
- try {
- this.func.apply(this.spec);
- } catch (e) {
- this.spec.fail(e);
- }
- onComplete();
-};
-/** JavaScript API reporter.
- *
- * @constructor
- */
-jasmine.JsApiReporter = function() {
- this.started = false;
- this.finished = false;
- this.suites_ = [];
- this.results_ = {};
-};
-
-jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) {
- this.started = true;
- var suites = runner.topLevelSuites();
- for (var i = 0; i < suites.length; i++) {
- var suite = suites[i];
- this.suites_.push(this.summarize_(suite));
- }
-};
-
-jasmine.JsApiReporter.prototype.suites = function() {
- return this.suites_;
-};
-
-jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) {
- var isSuite = suiteOrSpec instanceof jasmine.Suite;
- var summary = {
- id: suiteOrSpec.id,
- name: suiteOrSpec.description,
- type: isSuite ? 'suite' : 'spec',
- children: []
- };
-
- if (isSuite) {
- var children = suiteOrSpec.children();
- for (var i = 0; i < children.length; i++) {
- summary.children.push(this.summarize_(children[i]));
- }
- }
- return summary;
-};
-
-jasmine.JsApiReporter.prototype.results = function() {
- return this.results_;
-};
-
-jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) {
- return this.results_[specId];
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) {
- this.finished = true;
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) {
- this.results_[spec.id] = {
- messages: spec.results().getItems(),
- result: spec.results().failedCount > 0 ? "failed" : "passed"
- };
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.log = function(str) {
-};
-
-jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){
- var results = {};
- for (var i = 0; i < specIds.length; i++) {
- var specId = specIds[i];
- results[specId] = this.summarizeResult_(this.results_[specId]);
- }
- return results;
-};
-
-jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){
- var summaryMessages = [];
- var messagesLength = result.messages.length;
- for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) {
- var resultMessage = result.messages[messageIndex];
- summaryMessages.push({
- text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined,
- passed: resultMessage.passed ? resultMessage.passed() : true,
- type: resultMessage.type,
- message: resultMessage.message,
- trace: {
- stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined
- }
- });
- }
-
- return {
- result : result.result,
- messages : summaryMessages
- };
-};
-
-/**
- * @constructor
- * @param {jasmine.Env} env
- * @param actual
- * @param {jasmine.Spec} spec
- */
-jasmine.Matchers = function(env, actual, spec, opt_isNot) {
- this.env = env;
- this.actual = actual;
- this.spec = spec;
- this.isNot = opt_isNot || false;
- this.reportWasCalled_ = false;
-};
-
-// todo: @deprecated as of Jasmine 0.11, remove soon [xw]
-jasmine.Matchers.pp = function(str) {
- throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!");
-};
-
-// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw]
-jasmine.Matchers.prototype.report = function(result, failing_message, details) {
- throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs");
-};
-
-jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) {
- for (var methodName in prototype) {
- if (methodName == 'report') continue;
- var orig = prototype[methodName];
- matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig);
- }
-};
-
-jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) {
- return function() {
- var matcherArgs = jasmine.util.argsToArray(arguments);
- var result = matcherFunction.apply(this, arguments);
-
- if (this.isNot) {
- result = !result;
- }
-
- if (this.reportWasCalled_) return result;
-
- var message;
- if (!result) {
- if (this.message) {
- message = this.message.apply(this, arguments);
- if (jasmine.isArray_(message)) {
- message = message[this.isNot ? 1 : 0];
- }
- } else {
- var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); });
- message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate;
- if (matcherArgs.length > 0) {
- for (var i = 0; i < matcherArgs.length; i++) {
- if (i > 0) message += ",";
- message += " " + jasmine.pp(matcherArgs[i]);
- }
- }
- message += ".";
- }
- }
- var expectationResult = new jasmine.ExpectationResult({
- matcherName: matcherName,
- passed: result,
- expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0],
- actual: this.actual,
- message: message
- });
- this.spec.addMatcherResult(expectationResult);
- return jasmine.undefined;
- };
-};
-
-
-
-
-/**
- * toBe: compares the actual to the expected using ===
- * @param expected
- */
-jasmine.Matchers.prototype.toBe = function(expected) {
- return this.actual === expected;
-};
-
-/**
- * toNotBe: compares the actual to the expected using !==
- * @param expected
- * @deprecated as of 1.0. Use not.toBe() instead.
- */
-jasmine.Matchers.prototype.toNotBe = function(expected) {
- return this.actual !== expected;
-};
-
-/**
- * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc.
- *
- * @param expected
- */
-jasmine.Matchers.prototype.toEqual = function(expected) {
- return this.env.equals_(this.actual, expected);
-};
-
-/**
- * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual
- * @param expected
- * @deprecated as of 1.0. Use not.toNotEqual() instead.
- */
-jasmine.Matchers.prototype.toNotEqual = function(expected) {
- return !this.env.equals_(this.actual, expected);
-};
-
-/**
- * Matcher that compares the actual to the expected using a regular expression. Constructs a RegExp, so takes
- * a pattern or a String.
- *
- * @param expected
- */
-jasmine.Matchers.prototype.toMatch = function(expected) {
- return new RegExp(expected).test(this.actual);
-};
-
-/**
- * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch
- * @param expected
- * @deprecated as of 1.0. Use not.toMatch() instead.
- */
-jasmine.Matchers.prototype.toNotMatch = function(expected) {
- return !(new RegExp(expected).test(this.actual));
-};
-
-/**
- * Matcher that compares the actual to jasmine.undefined.
- */
-jasmine.Matchers.prototype.toBeDefined = function() {
- return (this.actual !== jasmine.undefined);
-};
-
-/**
- * Matcher that compares the actual to jasmine.undefined.
- */
-jasmine.Matchers.prototype.toBeUndefined = function() {
- return (this.actual === jasmine.undefined);
-};
-
-/**
- * Matcher that compares the actual to null.
- */
-jasmine.Matchers.prototype.toBeNull = function() {
- return (this.actual === null);
-};
-
-/**
- * Matcher that boolean not-nots the actual.
- */
-jasmine.Matchers.prototype.toBeTruthy = function() {
- return !!this.actual;
-};
-
-
-/**
- * Matcher that boolean nots the actual.
- */
-jasmine.Matchers.prototype.toBeFalsy = function() {
- return !this.actual;
-};
-
-
-/**
- * Matcher that checks to see if the actual, a Jasmine spy, was called.
- */
-jasmine.Matchers.prototype.toHaveBeenCalled = function() {
- if (arguments.length > 0) {
- throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith');
- }
-
- if (!jasmine.isSpy(this.actual)) {
- throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
- }
-
- this.message = function() {
- return [
- "Expected spy " + this.actual.identity + " to have been called.",
- "Expected spy " + this.actual.identity + " not to have been called."
- ];
- };
-
- return this.actual.wasCalled;
-};
-
-/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */
-jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled;
-
-/**
- * Matcher that checks to see if the actual, a Jasmine spy, was not called.
- *
- * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead
- */
-jasmine.Matchers.prototype.wasNotCalled = function() {
- if (arguments.length > 0) {
- throw new Error('wasNotCalled does not take arguments');
- }
-
- if (!jasmine.isSpy(this.actual)) {
- throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
- }
-
- this.message = function() {
- return [
- "Expected spy " + this.actual.identity + " to not have been called.",
- "Expected spy " + this.actual.identity + " to have been called."
- ];
- };
-
- return !this.actual.wasCalled;
-};
-
-/**
- * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters.
- *
- * @example
- *
- */
-jasmine.Matchers.prototype.toHaveBeenCalledWith = function() {
- var expectedArgs = jasmine.util.argsToArray(arguments);
- if (!jasmine.isSpy(this.actual)) {
- throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
- }
- this.message = function() {
- if (this.actual.callCount == 0) {
- // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw]
- return [
- "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.",
- "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was."
- ];
- } else {
- return [
- "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall),
- "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall)
- ];
- }
- };
-
- return this.env.contains_(this.actual.argsForCall, expectedArgs);
-};
-
-/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */
-jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith;
-
-/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */
-jasmine.Matchers.prototype.wasNotCalledWith = function() {
- var expectedArgs = jasmine.util.argsToArray(arguments);
- if (!jasmine.isSpy(this.actual)) {
- throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
- }
-
- this.message = function() {
- return [
- "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was",
- "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was"
- ]
- };
-
- return !this.env.contains_(this.actual.argsForCall, expectedArgs);
-};
-
-/**
- * Matcher that checks that the expected item is an element in the actual Array.
- *
- * @param {Object} expected
- */
-jasmine.Matchers.prototype.toContain = function(expected) {
- return this.env.contains_(this.actual, expected);
-};
-
-/**
- * Matcher that checks that the expected item is NOT an element in the actual Array.
- *
- * @param {Object} expected
- * @deprecated as of 1.0. Use not.toNotContain() instead.
- */
-jasmine.Matchers.prototype.toNotContain = function(expected) {
- return !this.env.contains_(this.actual, expected);
-};
-
-jasmine.Matchers.prototype.toBeLessThan = function(expected) {
- return this.actual < expected;
-};
-
-jasmine.Matchers.prototype.toBeGreaterThan = function(expected) {
- return this.actual > expected;
-};
-
-/**
- * Matcher that checks that the expected exception was thrown by the actual.
- *
- * @param {String} expected
- */
-jasmine.Matchers.prototype.toThrow = function(expected) {
- var result = false;
- var exception;
- if (typeof this.actual != 'function') {
- throw new Error('Actual is not a function');
- }
- try {
- this.actual();
- } catch (e) {
- exception = e;
- }
- if (exception) {
- result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected));
- }
-
- var not = this.isNot ? "not " : "";
-
- this.message = function() {
- if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
- return ["Expected function " + not + "to throw", expected ? expected.message || expected : " an exception", ", but it threw", exception.message || exception].join(' ');
- } else {
- return "Expected function to throw an exception.";
- }
- };
-
- return result;
-};
-
-jasmine.Matchers.Any = function(expectedClass) {
- this.expectedClass = expectedClass;
-};
-
-jasmine.Matchers.Any.prototype.matches = function(other) {
- if (this.expectedClass == String) {
- return typeof other == 'string' || other instanceof String;
- }
-
- if (this.expectedClass == Number) {
- return typeof other == 'number' || other instanceof Number;
- }
-
- if (this.expectedClass == Function) {
- return typeof other == 'function' || other instanceof Function;
- }
-
- if (this.expectedClass == Object) {
- return typeof other == 'object';
- }
-
- return other instanceof this.expectedClass;
-};
-
-jasmine.Matchers.Any.prototype.toString = function() {
- return '<jasmine.any(' + this.expectedClass + ')>';
-};
-
-/**
- * @constructor
- */
-jasmine.MultiReporter = function() {
- this.subReporters_ = [];
-};
-jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter);
-
-jasmine.MultiReporter.prototype.addReporter = function(reporter) {
- this.subReporters_.push(reporter);
-};
-
-(function() {
- var functionNames = [
- "reportRunnerStarting",
- "reportRunnerResults",
- "reportSuiteResults",
- "reportSpecStarting",
- "reportSpecResults",
- "log"
- ];
- for (var i = 0; i < functionNames.length; i++) {
- var functionName = functionNames[i];
- jasmine.MultiReporter.prototype[functionName] = (function(functionName) {
- return function() {
- for (var j = 0; j < this.subReporters_.length; j++) {
- var subReporter = this.subReporters_[j];
- if (subReporter[functionName]) {
- subReporter[functionName].apply(subReporter, arguments);
- }
- }
- };
- })(functionName);
- }
-})();
-/**
- * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults
- *
- * @constructor
- */
-jasmine.NestedResults = function() {
- /**
- * The total count of results
- */
- this.totalCount = 0;
- /**
- * Number of passed results
- */
- this.passedCount = 0;
- /**
- * Number of failed results
- */
- this.failedCount = 0;
- /**
- * Was this suite/spec skipped?
- */
- this.skipped = false;
- /**
- * @ignore
- */
- this.items_ = [];
-};
-
-/**
- * Roll up the result counts.
- *
- * @param result
- */
-jasmine.NestedResults.prototype.rollupCounts = function(result) {
- this.totalCount += result.totalCount;
- this.passedCount += result.passedCount;
- this.failedCount += result.failedCount;
-};
-
-/**
- * Adds a log message.
- * @param values Array of message parts which will be concatenated later.
- */
-jasmine.NestedResults.prototype.log = function(values) {
- this.items_.push(new jasmine.MessageResult(values));
-};
-
-/**
- * Getter for the results: message & results.
- */
-jasmine.NestedResults.prototype.getItems = function() {
- return this.items_;
-};
-
-/**
- * Adds a result, tracking counts (total, passed, & failed)
- * @param {jasmine.ExpectationResult|jasmine.NestedResults} result
- */
-jasmine.NestedResults.prototype.addResult = function(result) {
- if (result.type != 'log') {
- if (result.items_) {
- this.rollupCounts(result);
- } else {
- this.totalCount++;
- if (result.passed()) {
- this.passedCount++;
- } else {
- this.failedCount++;
- }
- }
- }
- this.items_.push(result);
-};
-
-/**
- * @returns {Boolean} True if <b>everything</b> below passed
- */
-jasmine.NestedResults.prototype.passed = function() {
- return this.passedCount === this.totalCount;
-};
-/**
- * Base class for pretty printing for expectation results.
- */
-jasmine.PrettyPrinter = function() {
- this.ppNestLevel_ = 0;
-};
-
-/**
- * Formats a value in a nice, human-readable string.
- *
- * @param value
- */
-jasmine.PrettyPrinter.prototype.format = function(value) {
- if (this.ppNestLevel_ > 40) {
- throw new Error('jasmine.PrettyPrinter: format() nested too deeply!');
- }
-
- this.ppNestLevel_++;
- try {
- if (value === jasmine.undefined) {
- this.emitScalar('undefined');
- } else if (value === null) {
- this.emitScalar('null');
- } else if (value === jasmine.getGlobal()) {
- this.emitScalar('<global>');
- } else if (value instanceof jasmine.Matchers.Any) {
- this.emitScalar(value.toString());
- } else if (typeof value === 'string') {
- this.emitString(value);
- } else if (jasmine.isSpy(value)) {
- this.emitScalar("spy on " + value.identity);
- } else if (value instanceof RegExp) {
- this.emitScalar(value.toString());
- } else if (typeof value === 'function') {
- this.emitScalar('Function');
- } else if (typeof value.nodeType === 'number') {
- this.emitScalar('HTMLNode');
- } else if (value instanceof Date) {
- this.emitScalar('Date(' + value + ')');
- } else if (value.__Jasmine_been_here_before__) {
- this.emitScalar('<circular reference: ' + (jasmine.isArray_(value) ? 'Array' : 'Object') + '>');
- } else if (jasmine.isArray_(value) || typeof value == 'object') {
- value.__Jasmine_been_here_before__ = true;
- if (jasmine.isArray_(value)) {
- this.emitArray(value);
- } else {
- this.emitObject(value);
- }
- delete value.__Jasmine_been_here_before__;
- } else {
- this.emitScalar(value.toString());
- }
- } finally {
- this.ppNestLevel_--;
- }
-};
-
-jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) {
- for (var property in obj) {
- if (property == '__Jasmine_been_here_before__') continue;
- fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) != null) : false);
- }
-};
-
-jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_;
-jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_;
-jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_;
-jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_;
-
-jasmine.StringPrettyPrinter = function() {
- jasmine.PrettyPrinter.call(this);
-
- this.string = '';
-};
-jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter);
-
-jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) {
- this.append(value);
-};
-
-jasmine.StringPrettyPrinter.prototype.emitString = function(value) {
- this.append("'" + value + "'");
-};
-
-jasmine.StringPrettyPrinter.prototype.emitArray = function(array) {
- this.append('[ ');
- for (var i = 0; i < array.length; i++) {
- if (i > 0) {
- this.append(', ');
- }
- this.format(array[i]);
- }
- this.append(' ]');
-};
-
-jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) {
- var self = this;
- this.append('{ ');
- var first = true;
-
- this.iterateObject(obj, function(property, isGetter) {
- if (first) {
- first = false;
- } else {
- self.append(', ');
- }
-
- self.append(property);
- self.append(' : ');
- if (isGetter) {
- self.append('<getter>');
- } else {
- self.format(obj[property]);
- }
- });
-
- this.append(' }');
-};
-
-jasmine.StringPrettyPrinter.prototype.append = function(value) {
- this.string += value;
-};
-jasmine.Queue = function(env) {
- this.env = env;
- this.blocks = [];
- this.running = false;
- this.index = 0;
- this.offset = 0;
- this.abort = false;
-};
-
-jasmine.Queue.prototype.addBefore = function(block) {
- this.blocks.unshift(block);
-};
-
-jasmine.Queue.prototype.add = function(block) {
- this.blocks.push(block);
-};
-
-jasmine.Queue.prototype.insertNext = function(block) {
- this.blocks.splice((this.index + this.offset + 1), 0, block);
- this.offset++;
-};
-
-jasmine.Queue.prototype.start = function(onComplete) {
- this.running = true;
- this.onComplete = onComplete;
- this.next_();
-};
-
-jasmine.Queue.prototype.isRunning = function() {
- return this.running;
-};
-
-jasmine.Queue.LOOP_DONT_RECURSE = true;
-
-jasmine.Queue.prototype.next_ = function() {
- var self = this;
- var goAgain = true;
-
- while (goAgain) {
- goAgain = false;
-
- if (self.index < self.blocks.length && !this.abort) {
- var calledSynchronously = true;
- var completedSynchronously = false;
-
- var onComplete = function () {
- if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) {
- completedSynchronously = true;
- return;
- }
-
- if (self.blocks[self.index].abort) {
- self.abort = true;
- }
-
- self.offset = 0;
- self.index++;
-
- var now = new Date().getTime();
- if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) {
- self.env.lastUpdate = now;
- self.env.setTimeout(function() {
- self.next_();
- }, 0);
- } else {
- if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) {
- goAgain = true;
- } else {
- self.next_();
- }
- }
- };
- self.blocks[self.index].execute(onComplete);
-
- calledSynchronously = false;
- if (completedSynchronously) {
- onComplete();
- }
-
- } else {
- self.running = false;
- if (self.onComplete) {
- self.onComplete();
- }
- }
- }
-};
-
-jasmine.Queue.prototype.results = function() {
- var results = new jasmine.NestedResults();
- for (var i = 0; i < this.blocks.length; i++) {
- if (this.blocks[i].results) {
- results.addResult(this.blocks[i].results());
- }
- }
- return results;
-};
-
-
-/**
- * Runner
- *
- * @constructor
- * @param {jasmine.Env} env
- */
-jasmine.Runner = function(env) {
- var self = this;
- self.env = env;
- self.queue = new jasmine.Queue(env);
- self.before_ = [];
- self.after_ = [];
- self.suites_ = [];
-};
-
-jasmine.Runner.prototype.execute = function() {
- var self = this;
- if (self.env.reporter.reportRunnerStarting) {
- self.env.reporter.reportRunnerStarting(this);
- }
- self.queue.start(function () {
- self.finishCallback();
- });
-};
-
-jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) {
- beforeEachFunction.typeName = 'beforeEach';
- this.before_.splice(0,0,beforeEachFunction);
-};
-
-jasmine.Runner.prototype.afterEach = function(afterEachFunction) {
- afterEachFunction.typeName = 'afterEach';
- this.after_.splice(0,0,afterEachFunction);
-};
-
-
-jasmine.Runner.prototype.finishCallback = function() {
- this.env.reporter.reportRunnerResults(this);
-};
-
-jasmine.Runner.prototype.addSuite = function(suite) {
- this.suites_.push(suite);
-};
-
-jasmine.Runner.prototype.add = function(block) {
- if (block instanceof jasmine.Suite) {
- this.addSuite(block);
- }
- this.queue.add(block);
-};
-
-jasmine.Runner.prototype.specs = function () {
- var suites = this.suites();
- var specs = [];
- for (var i = 0; i < suites.length; i++) {
- specs = specs.concat(suites[i].specs());
- }
- return specs;
-};
-
-jasmine.Runner.prototype.suites = function() {
- return this.suites_;
-};
-
-jasmine.Runner.prototype.topLevelSuites = function() {
- var topLevelSuites = [];
- for (var i = 0; i < this.suites_.length; i++) {
- if (!this.suites_[i].parentSuite) {
- topLevelSuites.push(this.suites_[i]);
- }
- }
- return topLevelSuites;
-};
-
-jasmine.Runner.prototype.results = function() {
- return this.queue.results();
-};
-/**
- * Internal representation of a Jasmine specification, or test.
- *
- * @constructor
- * @param {jasmine.Env} env
- * @param {jasmine.Suite} suite
- * @param {String} description
- */
-jasmine.Spec = function(env, suite, description) {
- if (!env) {
- throw new Error('jasmine.Env() required');
- }
- if (!suite) {
- throw new Error('jasmine.Suite() required');
- }
- var spec = this;
- spec.id = env.nextSpecId ? env.nextSpecId() : null;
- spec.env = env;
- spec.suite = suite;
- spec.description = description;
- spec.queue = new jasmine.Queue(env);
-
- spec.afterCallbacks = [];
- spec.spies_ = [];
-
- spec.results_ = new jasmine.NestedResults();
- spec.results_.description = description;
- spec.matchersClass = null;
-};
-
-jasmine.Spec.prototype.getFullName = function() {
- return this.suite.getFullName() + ' ' + this.description + '.';
-};
-
-
-jasmine.Spec.prototype.results = function() {
- return this.results_;
-};
-
-/**
- * All parameters are pretty-printed and concatenated together, then written to the spec's output.
- *
- * Be careful not to leave calls to <code>jasmine.log</code> in production code.
- */
-jasmine.Spec.prototype.log = function() {
- return this.results_.log(arguments);
-};
-
-jasmine.Spec.prototype.runs = function (func) {
- var block = new jasmine.Block(this.env, func, this);
- this.addToQueue(block);
- return this;
-};
-
-jasmine.Spec.prototype.addToQueue = function (block) {
- if (this.queue.isRunning()) {
- this.queue.insertNext(block);
- } else {
- this.queue.add(block);
- }
-};
-
-/**
- * @param {jasmine.ExpectationResult} result
- */
-jasmine.Spec.prototype.addMatcherResult = function(result) {
- this.results_.addResult(result);
-};
-
-jasmine.Spec.prototype.expect = function(actual) {
- var positive = new (this.getMatchersClass_())(this.env, actual, this);
- positive.not = new (this.getMatchersClass_())(this.env, actual, this, true);
- return positive;
-};
-
-/**
- * Waits a fixed time period before moving to the next block.
- *
- * @deprecated Use waitsFor() instead
- * @param {Number} timeout milliseconds to wait
- */
-jasmine.Spec.prototype.waits = function(timeout) {
- var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this);
- this.addToQueue(waitsFunc);
- return this;
-};
-
-/**
- * Waits for the latchFunction to return true before proceeding to the next block.
- *
- * @param {Function} latchFunction
- * @param {String} optional_timeoutMessage
- * @param {Number} optional_timeout
- */
-jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
- var latchFunction_ = null;
- var optional_timeoutMessage_ = null;
- var optional_timeout_ = null;
-
- for (var i = 0; i < arguments.length; i++) {
- var arg = arguments[i];
- switch (typeof arg) {
- case 'function':
- latchFunction_ = arg;
- break;
- case 'string':
- optional_timeoutMessage_ = arg;
- break;
- case 'number':
- optional_timeout_ = arg;
- break;
- }
- }
-
- var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this);
- this.addToQueue(waitsForFunc);
- return this;
-};
-
-jasmine.Spec.prototype.fail = function (e) {
- var expectationResult = new jasmine.ExpectationResult({
- passed: false,
- message: e ? jasmine.util.formatException(e) : 'Exception'
- });
- this.results_.addResult(expectationResult);
-};
-
-jasmine.Spec.prototype.getMatchersClass_ = function() {
- return this.matchersClass || this.env.matchersClass;
-};
-
-jasmine.Spec.prototype.addMatchers = function(matchersPrototype) {
- var parent = this.getMatchersClass_();
- var newMatchersClass = function() {
- parent.apply(this, arguments);
- };
- jasmine.util.inherit(newMatchersClass, parent);
- jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass);
- this.matchersClass = newMatchersClass;
-};
-
-jasmine.Spec.prototype.finishCallback = function() {
- this.env.reporter.reportSpecResults(this);
-};
-
-jasmine.Spec.prototype.finish = function(onComplete) {
- this.removeAllSpies();
- this.finishCallback();
- if (onComplete) {
- onComplete();
- }
-};
-
-jasmine.Spec.prototype.after = function(doAfter) {
- if (this.queue.isRunning()) {
- this.queue.add(new jasmine.Block(this.env, doAfter, this));
- } else {
- this.afterCallbacks.unshift(doAfter);
- }
-};
-
-jasmine.Spec.prototype.execute = function(onComplete) {
- var spec = this;
- if (!spec.env.specFilter(spec)) {
- spec.results_.skipped = true;
- spec.finish(onComplete);
- return;
- }
-
- this.env.reporter.reportSpecStarting(this);
-
- spec.env.currentSpec = spec;
-
- spec.addBeforesAndAftersToQueue();
-
- spec.queue.start(function () {
- spec.finish(onComplete);
- });
-};
-
-jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() {
- var runner = this.env.currentRunner();
- var i;
-
- for (var suite = this.suite; suite; suite = suite.parentSuite) {
- for (i = 0; i < suite.before_.length; i++) {
- this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this));
- }
- }
- for (i = 0; i < runner.before_.length; i++) {
- this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this));
- }
- for (i = 0; i < this.afterCallbacks.length; i++) {
- this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this));
- }
- for (suite = this.suite; suite; suite = suite.parentSuite) {
- for (i = 0; i < suite.after_.length; i++) {
- this.queue.add(new jasmine.Block(this.env, suite.after_[i], this));
- }
- }
- for (i = 0; i < runner.after_.length; i++) {
- this.queue.add(new jasmine.Block(this.env, runner.after_[i], this));
- }
-};
-
-jasmine.Spec.prototype.explodes = function() {
- throw 'explodes function should not have been called';
-};
-
-jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) {
- if (obj == jasmine.undefined) {
- throw "spyOn could not find an object to spy upon for " + methodName + "()";
- }
-
- if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) {
- throw methodName + '() method does not exist';
- }
-
- if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) {
- throw new Error(methodName + ' has already been spied upon');
- }
-
- var spyObj = jasmine.createSpy(methodName);
-
- this.spies_.push(spyObj);
- spyObj.baseObj = obj;
- spyObj.methodName = methodName;
- spyObj.originalValue = obj[methodName];
-
- obj[methodName] = spyObj;
-
- return spyObj;
-};
-
-jasmine.Spec.prototype.removeAllSpies = function() {
- for (var i = 0; i < this.spies_.length; i++) {
- var spy = this.spies_[i];
- spy.baseObj[spy.methodName] = spy.originalValue;
- }
- this.spies_ = [];
-};
-
-/**
- * Internal representation of a Jasmine suite.
- *
- * @constructor
- * @param {jasmine.Env} env
- * @param {String} description
- * @param {Function} specDefinitions
- * @param {jasmine.Suite} parentSuite
- */
-jasmine.Suite = function(env, description, specDefinitions, parentSuite) {
- var self = this;
- self.id = env.nextSuiteId ? env.nextSuiteId() : null;
- self.description = description;
- self.queue = new jasmine.Queue(env);
- self.parentSuite = parentSuite;
- self.env = env;
- self.before_ = [];
- self.after_ = [];
- self.children_ = [];
- self.suites_ = [];
- self.specs_ = [];
-};
-
-jasmine.Suite.prototype.getFullName = function() {
- var fullName = this.description;
- for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) {
- fullName = parentSuite.description + ' ' + fullName;
- }
- return fullName;
-};
-
-jasmine.Suite.prototype.finish = function(onComplete) {
- this.env.reporter.reportSuiteResults(this);
- this.finished = true;
- if (typeof(onComplete) == 'function') {
- onComplete();
- }
-};
-
-jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) {
- beforeEachFunction.typeName = 'beforeEach';
- this.before_.unshift(beforeEachFunction);
-};
-
-jasmine.Suite.prototype.afterEach = function(afterEachFunction) {
- afterEachFunction.typeName = 'afterEach';
- this.after_.unshift(afterEachFunction);
-};
-
-jasmine.Suite.prototype.results = function() {
- return this.queue.results();
-};
-
-jasmine.Suite.prototype.add = function(suiteOrSpec) {
- this.children_.push(suiteOrSpec);
- if (suiteOrSpec instanceof jasmine.Suite) {
- this.suites_.push(suiteOrSpec);
- this.env.currentRunner().addSuite(suiteOrSpec);
- } else {
- this.specs_.push(suiteOrSpec);
- }
- this.queue.add(suiteOrSpec);
-};
-
-jasmine.Suite.prototype.specs = function() {
- return this.specs_;
-};
-
-jasmine.Suite.prototype.suites = function() {
- return this.suites_;
-};
-
-jasmine.Suite.prototype.children = function() {
- return this.children_;
-};
-
-jasmine.Suite.prototype.execute = function(onComplete) {
- var self = this;
- this.queue.start(function () {
- self.finish(onComplete);
- });
-};
-jasmine.WaitsBlock = function(env, timeout, spec) {
- this.timeout = timeout;
- jasmine.Block.call(this, env, null, spec);
-};
-
-jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block);
-
-jasmine.WaitsBlock.prototype.execute = function (onComplete) {
- this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...');
- this.env.setTimeout(function () {
- onComplete();
- }, this.timeout);
-};
-/**
- * A block which waits for some condition to become true, with timeout.
- *
- * @constructor
- * @extends jasmine.Block
- * @param {jasmine.Env} env The Jasmine environment.
- * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true.
- * @param {Function} latchFunction A function which returns true when the desired condition has been met.
- * @param {String} message The message to display if the desired condition hasn't been met within the given time period.
- * @param {jasmine.Spec} spec The Jasmine spec.
- */
-jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) {
- this.timeout = timeout || env.defaultTimeoutInterval;
- this.latchFunction = latchFunction;
- this.message = message;
- this.totalTimeSpentWaitingForLatch = 0;
- jasmine.Block.call(this, env, null, spec);
-};
-jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block);
-
-jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10;
-
-jasmine.WaitsForBlock.prototype.execute = function(onComplete) {
- this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen'));
- var latchFunctionResult;
- try {
- latchFunctionResult = this.latchFunction.apply(this.spec);
- } catch (e) {
- this.spec.fail(e);
- onComplete();
- return;
- }
-
- if (latchFunctionResult) {
- onComplete();
- } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) {
- var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen');
- this.spec.fail({
- name: 'timeout',
- message: message
- });
-
- this.abort = true;
- onComplete();
- } else {
- this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;
- var self = this;
- this.env.setTimeout(function() {
- self.execute(onComplete);
- }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);
- }
-};
-// Mock setTimeout, clearTimeout
-// Contributed by Pivotal Computer Systems, www.pivotalsf.com
-
-jasmine.FakeTimer = function() {
- this.reset();
-
- var self = this;
- self.setTimeout = function(funcToCall, millis) {
- self.timeoutsMade++;
- self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false);
- return self.timeoutsMade;
- };
-
- self.setInterval = function(funcToCall, millis) {
- self.timeoutsMade++;
- self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true);
- return self.timeoutsMade;
- };
-
- self.clearTimeout = function(timeoutKey) {
- self.scheduledFunctions[timeoutKey] = jasmine.undefined;
- };
-
- self.clearInterval = function(timeoutKey) {
- self.scheduledFunctions[timeoutKey] = jasmine.undefined;
- };
-
-};
-
-jasmine.FakeTimer.prototype.reset = function() {
- this.timeoutsMade = 0;
- this.scheduledFunctions = {};
- this.nowMillis = 0;
-};
-
-jasmine.FakeTimer.prototype.tick = function(millis) {
- var oldMillis = this.nowMillis;
- var newMillis = oldMillis + millis;
- this.runFunctionsWithinRange(oldMillis, newMillis);
- this.nowMillis = newMillis;
-};
-
-jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) {
- var scheduledFunc;
- var funcsToRun = [];
- for (var timeoutKey in this.scheduledFunctions) {
- scheduledFunc = this.scheduledFunctions[timeoutKey];
- if (scheduledFunc != jasmine.undefined &&
- scheduledFunc.runAtMillis >= oldMillis &&
- scheduledFunc.runAtMillis <= nowMillis) {
- funcsToRun.push(scheduledFunc);
- this.scheduledFunctions[timeoutKey] = jasmine.undefined;
- }
- }
-
- if (funcsToRun.length > 0) {
- funcsToRun.sort(function(a, b) {
- return a.runAtMillis - b.runAtMillis;
- });
- for (var i = 0; i < funcsToRun.length; ++i) {
- try {
- var funcToRun = funcsToRun[i];
- this.nowMillis = funcToRun.runAtMillis;
- funcToRun.funcToCall();
- if (funcToRun.recurring) {
- this.scheduleFunction(funcToRun.timeoutKey,
- funcToRun.funcToCall,
- funcToRun.millis,
- true);
- }
- } catch(e) {
- }
- }
- this.runFunctionsWithinRange(oldMillis, nowMillis);
- }
-};
-
-jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) {
- this.scheduledFunctions[timeoutKey] = {
- runAtMillis: this.nowMillis + millis,
- funcToCall: funcToCall,
- recurring: recurring,
- timeoutKey: timeoutKey,
- millis: millis
- };
-};
-
-/**
- * @namespace
- */
-jasmine.Clock = {
- defaultFakeTimer: new jasmine.FakeTimer(),
-
- reset: function() {
- jasmine.Clock.assertInstalled();
- jasmine.Clock.defaultFakeTimer.reset();
- },
-
- tick: function(millis) {
- jasmine.Clock.assertInstalled();
- jasmine.Clock.defaultFakeTimer.tick(millis);
- },
-
- runFunctionsWithinRange: function(oldMillis, nowMillis) {
- jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis);
- },
-
- scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
- jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring);
- },
-
- useMock: function() {
- if (!jasmine.Clock.isInstalled()) {
- var spec = jasmine.getEnv().currentSpec;
- spec.after(jasmine.Clock.uninstallMock);
-
- jasmine.Clock.installMock();
- }
- },
-
- installMock: function() {
- jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer;
- },
-
- uninstallMock: function() {
- jasmine.Clock.assertInstalled();
- jasmine.Clock.installed = jasmine.Clock.real;
- },
-
- real: {
- setTimeout: jasmine.getGlobal().setTimeout,
- clearTimeout: jasmine.getGlobal().clearTimeout,
- setInterval: jasmine.getGlobal().setInterval,
- clearInterval: jasmine.getGlobal().clearInterval
- },
-
- assertInstalled: function() {
- if (!jasmine.Clock.isInstalled()) {
- throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()");
- }
- },
-
- isInstalled: function() {
- return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer;
- },
-
- installed: null
-};
-jasmine.Clock.installed = jasmine.Clock.real;
-
-//else for IE support
-jasmine.getGlobal().setTimeout = function(funcToCall, millis) {
- if (jasmine.Clock.installed.setTimeout.apply) {
- return jasmine.Clock.installed.setTimeout.apply(this, arguments);
- } else {
- return jasmine.Clock.installed.setTimeout(funcToCall, millis);
- }
-};
-
-jasmine.getGlobal().setInterval = function(funcToCall, millis) {
- if (jasmine.Clock.installed.setInterval.apply) {
- return jasmine.Clock.installed.setInterval.apply(this, arguments);
- } else {
- return jasmine.Clock.installed.setInterval(funcToCall, millis);
- }
-};
-
-jasmine.getGlobal().clearTimeout = function(timeoutKey) {
- if (jasmine.Clock.installed.clearTimeout.apply) {
- return jasmine.Clock.installed.clearTimeout.apply(this, arguments);
- } else {
- return jasmine.Clock.installed.clearTimeout(timeoutKey);
- }
-};
-
-jasmine.getGlobal().clearInterval = function(timeoutKey) {
- if (jasmine.Clock.installed.clearTimeout.apply) {
- return jasmine.Clock.installed.clearInterval.apply(this, arguments);
- } else {
- return jasmine.Clock.installed.clearInterval(timeoutKey);
- }
-};
-
-
-jasmine.version_= {
- "major": 1,
- "minor": 0,
- "build": 1,
- "revision": 1286311016
-};
diff --git a/tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js b/tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js
deleted file mode 100644
index a867f72c..00000000
--- a/tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js
+++ /dev/null
@@ -1,488 +0,0 @@
-// This file stores the results from the PHP parser for certain messages and arguments,
-// so we can test the equivalent Javascript libraries.
-// Last generated with makeLanguageSpec.php at 2011-01-28T02:04:09+00:00
-
-mediaWiki.messages.set( {
- "en_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
- "en_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
- "fr_undelete_short": "Restaurer $1 modification{{PLURAL:$1||s}}",
- "fr_category-subcat-count": "Cette cat\u00e9gorie comprend {{PLURAL:$2|la sous-cat\u00e9gorie|$2 sous-cat\u00e9gories, dont {{PLURAL:$1|celle|les $1}}}} ci-dessous.",
- "ar_undelete_short": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 {{PLURAL:$1|\u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f|\u062a\u0639\u062f\u064a\u0644\u064a\u0646|$1 \u062a\u0639\u062f\u064a\u0644\u0627\u062a|$1 \u062a\u0639\u062f\u064a\u0644|$1 \u062a\u0639\u062f\u064a\u0644\u0627}}",
- "ar_category-subcat-count": "{{PLURAL:$2|\u0644\u0627 \u062a\u0635\u0627\u0646\u064a\u0641 \u0641\u0631\u0639\u064a\u0629 \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u0642\u0637.|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 {{PLURAL:$1||\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a|\u0647\u0630\u064a\u0646 \u0627\u0644\u062a\u0635\u0646\u064a\u0641\u064a\u0646 \u0627\u0644\u0641\u0631\u0639\u064a\u064a\u0646|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0627\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u0629|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0646\u064a\u0641\u0627 \u0641\u0631\u0639\u064a\u0627|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0646\u064a\u0641 \u0641\u0631\u0639\u064a}}\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a $2.}}",
- "jp_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
- "jp_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
- "zh_undelete_short": "\u6062\u590d\u88ab\u5220\u9664\u7684$1\u9879\u4fee\u8ba2",
- "zh_category-subcat-count": "{{PLURAL:$2|\u672c\u5206\u7c7b\u53ea\u6709\u4e0b\u5217\u4e00\u4e2a\u5b50\u5206\u7c7b\u3002|\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u5217$1\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u6709$2\u4e2a\u5b50\u5206\u7c7b\u3002}}"
-} );
-var jasmineMsgSpec = [
- {
- "name": "en undelete_short 0",
- "key": "en_undelete_short",
- "args": [
- 0
- ],
- "result": "Undelete 0 edits",
- "lang": "en"
- },
- {
- "name": "en undelete_short 1",
- "key": "en_undelete_short",
- "args": [
- 1
- ],
- "result": "Undelete one edit",
- "lang": "en"
- },
- {
- "name": "en undelete_short 2",
- "key": "en_undelete_short",
- "args": [
- 2
- ],
- "result": "Undelete 2 edits",
- "lang": "en"
- },
- {
- "name": "en undelete_short 5",
- "key": "en_undelete_short",
- "args": [
- 5
- ],
- "result": "Undelete 5 edits",
- "lang": "en"
- },
- {
- "name": "en undelete_short 21",
- "key": "en_undelete_short",
- "args": [
- 21
- ],
- "result": "Undelete 21 edits",
- "lang": "en"
- },
- {
- "name": "en undelete_short 101",
- "key": "en_undelete_short",
- "args": [
- 101
- ],
- "result": "Undelete 101 edits",
- "lang": "en"
- },
- {
- "name": "en category-subcat-count 0,10",
- "key": "en_category-subcat-count",
- "args": [
- 0,
- 10
- ],
- "result": "This category has the following 0 subcategories, out of 10 total.",
- "lang": "en"
- },
- {
- "name": "en category-subcat-count 1,1",
- "key": "en_category-subcat-count",
- "args": [
- 1,
- 1
- ],
- "result": "This category has only the following subcategory.",
- "lang": "en"
- },
- {
- "name": "en category-subcat-count 1,2",
- "key": "en_category-subcat-count",
- "args": [
- 1,
- 2
- ],
- "result": "This category has the following subcategory, out of 2 total.",
- "lang": "en"
- },
- {
- "name": "en category-subcat-count 3,30",
- "key": "en_category-subcat-count",
- "args": [
- 3,
- 30
- ],
- "result": "This category has the following 3 subcategories, out of 30 total.",
- "lang": "en"
- },
- {
- "name": "fr undelete_short 0",
- "key": "fr_undelete_short",
- "args": [
- 0
- ],
- "result": "Restaurer 0 modification",
- "lang": "fr"
- },
- {
- "name": "fr undelete_short 1",
- "key": "fr_undelete_short",
- "args": [
- 1
- ],
- "result": "Restaurer 1 modification",
- "lang": "fr"
- },
- {
- "name": "fr undelete_short 2",
- "key": "fr_undelete_short",
- "args": [
- 2
- ],
- "result": "Restaurer 2 modifications",
- "lang": "fr"
- },
- {
- "name": "fr undelete_short 5",
- "key": "fr_undelete_short",
- "args": [
- 5
- ],
- "result": "Restaurer 5 modifications",
- "lang": "fr"
- },
- {
- "name": "fr undelete_short 21",
- "key": "fr_undelete_short",
- "args": [
- 21
- ],
- "result": "Restaurer 21 modifications",
- "lang": "fr"
- },
- {
- "name": "fr undelete_short 101",
- "key": "fr_undelete_short",
- "args": [
- 101
- ],
- "result": "Restaurer 101 modifications",
- "lang": "fr"
- },
- {
- "name": "fr category-subcat-count 0,10",
- "key": "fr_category-subcat-count",
- "args": [
- 0,
- 10
- ],
- "result": "Cette cat\u00e9gorie comprend 10 sous-cat\u00e9gories, dont celle ci-dessous.",
- "lang": "fr"
- },
- {
- "name": "fr category-subcat-count 1,1",
- "key": "fr_category-subcat-count",
- "args": [
- 1,
- 1
- ],
- "result": "Cette cat\u00e9gorie comprend la sous-cat\u00e9gorie ci-dessous.",
- "lang": "fr"
- },
- {
- "name": "fr category-subcat-count 1,2",
- "key": "fr_category-subcat-count",
- "args": [
- 1,
- 2
- ],
- "result": "Cette cat\u00e9gorie comprend 2 sous-cat\u00e9gories, dont celle ci-dessous.",
- "lang": "fr"
- },
- {
- "name": "fr category-subcat-count 3,30",
- "key": "fr_category-subcat-count",
- "args": [
- 3,
- 30
- ],
- "result": "Cette cat\u00e9gorie comprend 30 sous-cat\u00e9gories, dont les 3 ci-dessous.",
- "lang": "fr"
- },
- {
- "name": "ar undelete_short 0",
- "key": "ar_undelete_short",
- "args": [
- 0
- ],
- "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f",
- "lang": "ar"
- },
- {
- "name": "ar undelete_short 1",
- "key": "ar_undelete_short",
- "args": [
- 1
- ],
- "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644\u064a\u0646",
- "lang": "ar"
- },
- {
- "name": "ar undelete_short 2",
- "key": "ar_undelete_short",
- "args": [
- 2
- ],
- "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 2 \u062a\u0639\u062f\u064a\u0644\u0627\u062a",
- "lang": "ar"
- },
- {
- "name": "ar undelete_short 5",
- "key": "ar_undelete_short",
- "args": [
- 5
- ],
- "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 5 \u062a\u0639\u062f\u064a\u0644",
- "lang": "ar"
- },
- {
- "name": "ar undelete_short 21",
- "key": "ar_undelete_short",
- "args": [
- 21
- ],
- "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 21 \u062a\u0639\u062f\u064a\u0644\u0627",
- "lang": "ar"
- },
- {
- "name": "ar undelete_short 101",
- "key": "ar_undelete_short",
- "args": [
- 101
- ],
- "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 101 \u062a\u0639\u062f\u064a\u0644\u0627",
- "lang": "ar"
- },
- {
- "name": "ar category-subcat-count 0,10",
- "key": "ar_category-subcat-count",
- "args": [
- 0,
- 10
- ],
- "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 10.",
- "lang": "ar"
- },
- {
- "name": "ar category-subcat-count 1,1",
- "key": "ar_category-subcat-count",
- "args": [
- 1,
- 1
- ],
- "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u0642\u0637.",
- "lang": "ar"
- },
- {
- "name": "ar category-subcat-count 1,2",
- "key": "ar_category-subcat-count",
- "args": [
- 1,
- 2
- ],
- "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 2.",
- "lang": "ar"
- },
- {
- "name": "ar category-subcat-count 3,30",
- "key": "ar_category-subcat-count",
- "args": [
- 3,
- 30
- ],
- "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0647\u0630\u0647 \u0627\u06443 \u062a\u0635\u0627\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u0629\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 30.",
- "lang": "ar"
- },
- {
- "name": "jp undelete_short 0",
- "key": "jp_undelete_short",
- "args": [
- 0
- ],
- "result": "Undelete 0 edits",
- "lang": "jp"
- },
- {
- "name": "jp undelete_short 1",
- "key": "jp_undelete_short",
- "args": [
- 1
- ],
- "result": "Undelete one edit",
- "lang": "jp"
- },
- {
- "name": "jp undelete_short 2",
- "key": "jp_undelete_short",
- "args": [
- 2
- ],
- "result": "Undelete 2 edits",
- "lang": "jp"
- },
- {
- "name": "jp undelete_short 5",
- "key": "jp_undelete_short",
- "args": [
- 5
- ],
- "result": "Undelete 5 edits",
- "lang": "jp"
- },
- {
- "name": "jp undelete_short 21",
- "key": "jp_undelete_short",
- "args": [
- 21
- ],
- "result": "Undelete 21 edits",
- "lang": "jp"
- },
- {
- "name": "jp undelete_short 101",
- "key": "jp_undelete_short",
- "args": [
- 101
- ],
- "result": "Undelete 101 edits",
- "lang": "jp"
- },
- {
- "name": "jp category-subcat-count 0,10",
- "key": "jp_category-subcat-count",
- "args": [
- 0,
- 10
- ],
- "result": "This category has the following 0 subcategories, out of 10 total.",
- "lang": "jp"
- },
- {
- "name": "jp category-subcat-count 1,1",
- "key": "jp_category-subcat-count",
- "args": [
- 1,
- 1
- ],
- "result": "This category has only the following subcategory.",
- "lang": "jp"
- },
- {
- "name": "jp category-subcat-count 1,2",
- "key": "jp_category-subcat-count",
- "args": [
- 1,
- 2
- ],
- "result": "This category has the following subcategory, out of 2 total.",
- "lang": "jp"
- },
- {
- "name": "jp category-subcat-count 3,30",
- "key": "jp_category-subcat-count",
- "args": [
- 3,
- 30
- ],
- "result": "This category has the following 3 subcategories, out of 30 total.",
- "lang": "jp"
- },
- {
- "name": "zh undelete_short 0",
- "key": "zh_undelete_short",
- "args": [
- 0
- ],
- "result": "\u6062\u590d\u88ab\u5220\u9664\u76840\u9879\u4fee\u8ba2",
- "lang": "zh"
- },
- {
- "name": "zh undelete_short 1",
- "key": "zh_undelete_short",
- "args": [
- 1
- ],
- "result": "\u6062\u590d\u88ab\u5220\u9664\u76841\u9879\u4fee\u8ba2",
- "lang": "zh"
- },
- {
- "name": "zh undelete_short 2",
- "key": "zh_undelete_short",
- "args": [
- 2
- ],
- "result": "\u6062\u590d\u88ab\u5220\u9664\u76842\u9879\u4fee\u8ba2",
- "lang": "zh"
- },
- {
- "name": "zh undelete_short 5",
- "key": "zh_undelete_short",
- "args": [
- 5
- ],
- "result": "\u6062\u590d\u88ab\u5220\u9664\u76845\u9879\u4fee\u8ba2",
- "lang": "zh"
- },
- {
- "name": "zh undelete_short 21",
- "key": "zh_undelete_short",
- "args": [
- 21
- ],
- "result": "\u6062\u590d\u88ab\u5220\u9664\u768421\u9879\u4fee\u8ba2",
- "lang": "zh"
- },
- {
- "name": "zh undelete_short 101",
- "key": "zh_undelete_short",
- "args": [
- 101
- ],
- "result": "\u6062\u590d\u88ab\u5220\u9664\u7684101\u9879\u4fee\u8ba2",
- "lang": "zh"
- },
- {
- "name": "zh category-subcat-count 0,10",
- "key": "zh_category-subcat-count",
- "args": [
- 0,
- 10
- ],
- "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52170\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u670910\u4e2a\u5b50\u5206\u7c7b\u3002",
- "lang": "zh"
- },
- {
- "name": "zh category-subcat-count 1,1",
- "key": "zh_category-subcat-count",
- "args": [
- 1,
- 1
- ],
- "result": "\u672c\u5206\u7c7b\u53ea\u6709\u4e0b\u5217\u4e00\u4e2a\u5b50\u5206\u7c7b\u3002",
- "lang": "zh"
- },
- {
- "name": "zh category-subcat-count 1,2",
- "key": "zh_category-subcat-count",
- "args": [
- 1,
- 2
- ],
- "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52171\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u67092\u4e2a\u5b50\u5206\u7c7b\u3002",
- "lang": "zh"
- },
- {
- "name": "zh category-subcat-count 3,30",
- "key": "zh_category-subcat-count",
- "args": [
- 3,
- 30
- ],
- "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52173\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u670930\u4e2a\u5b50\u5206\u7c7b\u3002",
- "lang": "zh"
- }
-];
diff --git a/tests/jasmine/spec/mediawiki.jqueryMsg.spec.js b/tests/jasmine/spec/mediawiki.jqueryMsg.spec.js
deleted file mode 100644
index 46dcaa80..00000000
--- a/tests/jasmine/spec/mediawiki.jqueryMsg.spec.js
+++ /dev/null
@@ -1,389 +0,0 @@
-/* spec for language & message behaviour in MediaWiki */
-
-mw.messages.set( {
- "en_empty": "",
- "en_simple": "Simple message",
- "en_replace": "Simple $1 replacement",
- "en_replace2": "Simple $1 $2 replacements",
- "en_link": "Simple [http://example.com link to example].",
- "en_link_replace": "Complex [$1 $2] behaviour.",
- "en_simple_magic": "Simple {{ALOHOMORA}} message",
- "en_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
- "en_undelete_empty_param": "Undelete{{PLURAL:$1|| multiple edits}}",
- "en_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
- "en_escape0": "Escape \\to fantasy island",
- "en_escape1": "I had \\$2.50 in my pocket",
- "en_escape2": "I had {{PLURAL:$1|the absolute \\|$1\\| which came out to \\$3.00 in my C:\\\\drive| some stuff}}",
- "en_fail": "This should fail to {{parse",
- "en_fail_magic": "There is no such magic word as {{SIETNAME}}",
- "en_evil": "This has <script type='text/javascript'>window.en_evil = true;</script> tags"
-} );
-
-/**
- * Tests
- */
-( function( mw, $, undefined ) {
-
- describe( "mediaWiki.jqueryMsg", function() {
-
- describe( "basic message functionality", function() {
-
- it( "should return identity for empty string", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_empty' ).html() ).toEqual( '' );
- } );
-
-
- it( "should return identity for simple string", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_simple' ).html() ).toEqual( 'Simple message' );
- } );
-
- } );
-
- describe( "escaping", function() {
-
- it ( "should handle simple escaping", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_escape0' ).html() ).toEqual( 'Escape to fantasy island' );
- } );
-
- it ( "should escape dollar signs found in ordinary text when backslashed", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_escape1' ).html() ).toEqual( 'I had $2.50 in my pocket' );
- } );
-
- it ( "should handle a complicated escaping case, including escaped pipe chars in template args", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_escape2', [ 1 ] ).html() ).toEqual( 'I had the absolute |1| which came out to $3.00 in my C:\\drive' );
- } );
-
- } );
-
- describe( "replacing", function() {
-
- it ( "should handle simple replacing", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_replace', [ 'foo' ] ).html() ).toEqual( 'Simple foo replacement' );
- } );
-
- it ( "should return $n if replacement not there", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_replace', [] ).html() ).toEqual( 'Simple $1 replacement' );
- expect( parser.parse( 'en_replace2', [ 'bar' ] ).html() ).toEqual( 'Simple bar $2 replacements' );
- } );
-
- } );
-
- describe( "linking", function() {
-
- it ( "should handle a simple link", function() {
- var parser = new mw.jqueryMsg.parser();
- var parsed = parser.parse( 'en_link' );
- var contents = parsed.contents();
- expect( contents.length ).toEqual( 3 );
- expect( contents[0].nodeName ).toEqual( '#text' );
- expect( contents[0].nodeValue ).toEqual( 'Simple ' );
- expect( contents[1].nodeName ).toEqual( 'A' );
- expect( contents[1].getAttribute( 'href' ) ).toEqual( 'http://example.com' );
- expect( contents[1].childNodes[0].nodeValue ).toEqual( 'link to example' );
- expect( contents[2].nodeName ).toEqual( '#text' );
- expect( contents[2].nodeValue ).toEqual( '.' );
- } );
-
- it ( "should replace a URL into a link", function() {
- var parser = new mw.jqueryMsg.parser();
- var parsed = parser.parse( 'en_link_replace', [ 'http://example.com/foo', 'linking' ] );
- var contents = parsed.contents();
- expect( contents.length ).toEqual( 3 );
- expect( contents[0].nodeName ).toEqual( '#text' );
- expect( contents[0].nodeValue ).toEqual( 'Complex ' );
- expect( contents[1].nodeName ).toEqual( 'A' );
- expect( contents[1].getAttribute( 'href' ) ).toEqual( 'http://example.com/foo' );
- expect( contents[1].childNodes[0].nodeValue ).toEqual( 'linking' );
- expect( contents[2].nodeName ).toEqual( '#text' );
- expect( contents[2].nodeValue ).toEqual( ' behaviour.' );
- } );
-
- it ( "should bind a click handler into a link", function() {
- var parser = new mw.jqueryMsg.parser();
- var clicked = false;
- var click = function() { clicked = true; };
- var parsed = parser.parse( 'en_link_replace', [ click, 'linking' ] );
- var contents = parsed.contents();
- expect( contents.length ).toEqual( 3 );
- expect( contents[0].nodeName ).toEqual( '#text' );
- expect( contents[0].nodeValue ).toEqual( 'Complex ' );
- expect( contents[1].nodeName ).toEqual( 'A' );
- expect( contents[1].getAttribute( 'href' ) ).toEqual( '#' );
- expect( contents[1].childNodes[0].nodeValue ).toEqual( 'linking' );
- expect( contents[2].nodeName ).toEqual( '#text' );
- expect( contents[2].nodeValue ).toEqual( ' behaviour.' );
- // determining bindings is hard in IE
- var anchor = parsed.find( 'a' );
- if ( ( $.browser.mozilla || $.browser.webkit ) && anchor.click ) {
- expect( clicked ).toEqual( false );
- anchor.click();
- expect( clicked ).toEqual( true );
- }
- } );
-
- it ( "should wrap a jquery arg around link contents -- even another element", function() {
- var parser = new mw.jqueryMsg.parser();
- var clicked = false;
- var click = function() { clicked = true; };
- var button = $( '<button>' ).click( click );
- var parsed = parser.parse( 'en_link_replace', [ button, 'buttoning' ] );
- var contents = parsed.contents();
- expect( contents.length ).toEqual( 3 );
- expect( contents[0].nodeName ).toEqual( '#text' );
- expect( contents[0].nodeValue ).toEqual( 'Complex ' );
- expect( contents[1].nodeName ).toEqual( 'BUTTON' );
- expect( contents[1].childNodes[0].nodeValue ).toEqual( 'buttoning' );
- expect( contents[2].nodeName ).toEqual( '#text' );
- expect( contents[2].nodeValue ).toEqual( ' behaviour.' );
- // determining bindings is hard in IE
- if ( ( $.browser.mozilla || $.browser.webkit ) && button.click ) {
- expect( clicked ).toEqual( false );
- parsed.find( 'button' ).click();
- expect( clicked ).toEqual( true );
- }
- } );
-
-
- } );
-
-
- describe( "magic keywords", function() {
- it( "should substitute magic keywords", function() {
- var options = {
- magic: {
- 'alohomora' : 'open'
- }
- };
- var parser = new mw.jqueryMsg.parser( options );
- expect( parser.parse( 'en_simple_magic' ).html() ).toEqual( 'Simple open message' );
- } );
- } );
-
- describe( "error conditions", function() {
- it( "should return non-existent key in square brackets", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_does_not_exist' ).html() ).toEqual( '[en_does_not_exist]' );
- } );
-
-
- it( "should fail to parse", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( function() { parser.parse( 'en_fail' ); } ).toThrow(
- 'Parse error at position 20 in input: This should fail to {{parse'
- );
- } );
- } );
-
- describe( "empty parameters", function() {
- it( "should deal with empty parameters", function() {
- var parser = new mw.jqueryMsg.parser();
- var ast = parser.getAst( 'en_undelete_empty_param' );
- expect( parser.parse( 'en_undelete_empty_param', [ 1 ] ).html() ).toEqual( 'Undelete' );
- expect( parser.parse( 'en_undelete_empty_param', [ 3 ] ).html() ).toEqual( 'Undelete multiple edits' );
-
- } );
- } );
-
- describe( "easy message interface functions", function() {
- it( "should allow a global that returns strings", function() {
- var gM = mw.jqueryMsg.getMessageFunction();
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- // a surrounding <SPAN> is needed for html() to work right
- var expectedHtml = $( '<span>Complex <a href="http://example.com/foo">linking</a> behaviour.</span>' ).html();
- var result = gM( 'en_link_replace', 'http://example.com/foo', 'linking' );
- expect( typeof result ).toEqual( 'string' );
- expect( result ).toEqual( expectedHtml );
- } );
-
- it( "should allow a jQuery plugin that appends to nodes", function() {
- $.fn.msg = mw.jqueryMsg.getPlugin();
- var $div = $( '<div>' ).append( $( '<p>' ).addClass( 'foo' ) );
- var clicked = false;
- var $button = $( '<button>' ).click( function() { clicked = true; } );
- $div.find( '.foo' ).msg( 'en_link_replace', $button, 'buttoning' );
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- // a surrounding <SPAN> is needed for html() to work right
- var expectedHtml = $( '<span>Complex <button>buttoning</button> behaviour.</span>' ).html();
- var createdHtml = $div.find( '.foo' ).html();
- // it is hard to test for clicks with IE; also it inserts or removes spaces around nodes when creating HTML tags, depending on their type.
- // so need to check the strings stripped of spaces.
- if ( ( $.browser.mozilla || $.browser.webkit ) && $button.click ) {
- expect( createdHtml ).toEqual( expectedHtml );
- $div.find( 'button ').click();
- expect( clicked ).toEqual( true );
- } else if ( $.browser.ie ) {
- expect( createdHtml.replace( /\s/, '' ) ).toEqual( expectedHtml.replace( /\s/, '' ) );
- }
- delete $.fn.msg;
- } );
-
- it( "jQuery plugin should escape incoming string arguments", function() {
- $.fn.msg = mw.jqueryMsg.getPlugin();
- var $div = $( '<div>' ).addClass( 'foo' );
- $div.msg( 'en_replace', '<p>x</p>' ); // looks like HTML, but as a string, should be escaped.
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- var expectedHtml = $( '<div class="foo">Simple &lt;p&gt;x&lt;/p&gt; replacement</div>' ).html();
- var createdHtml = $div.html();
- expect( expectedHtml ).toEqual( createdHtml );
- delete $.fn.msg;
- } );
-
-
- it( "jQuery plugin should never execute scripts", function() {
- window.en_evil = false;
- $.fn.msg = mw.jqueryMsg.getPlugin();
- var $div = $( '<div>' );
- $div.msg( 'en_evil' );
- expect( window.en_evil ).toEqual( false );
- delete $.fn.msg;
- } );
-
-
- // n.b. this passes because jQuery already seems to strip scripts away; however, it still executes them if they are appended to any element.
- it( "jQuery plugin should never emit scripts", function() {
- $.fn.msg = mw.jqueryMsg.getPlugin();
- var $div = $( '<div>' );
- $div.msg( 'en_evil' );
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- var expectedHtml = $( '<div>This has tags</div>' ).html();
- var createdHtml = $div.html();
- expect( expectedHtml ).toEqual( createdHtml );
- console.log( 'expected: ' + expectedHtml );
- console.log( 'created: ' + createdHtml );
- delete $.fn.msg;
- } );
-
-
-
- } );
-
- // The parser functions can throw errors, but let's not actually blow up for the user -- instead dump the error into the interface so we have
- // a chance at fixing this
- describe( "easy message interface functions with graceful failures", function() {
- it( "should allow a global that returns strings, with graceful failure", function() {
- var gM = mw.jqueryMsg.getMessageFunction();
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- // a surrounding <SPAN> is needed for html() to work right
- var expectedHtml = $( '<span>en_fail: Parse error at position 20 in input: This should fail to {{parse</span>' ).html();
- var result = gM( 'en_fail' );
- expect( typeof result ).toEqual( 'string' );
- expect( result ).toEqual( expectedHtml );
- } );
-
- it( "should allow a global that returns strings, with graceful failure on missing magic words", function() {
- var gM = mw.jqueryMsg.getMessageFunction();
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- // a surrounding <SPAN> is needed for html() to work right
- var expectedHtml = $( '<span>en_fail_magic: unknown operation "sietname"</span>' ).html();
- var result = gM( 'en_fail_magic' );
- expect( typeof result ).toEqual( 'string' );
- expect( result ).toEqual( expectedHtml );
- } );
-
-
- it( "should allow a jQuery plugin, with graceful failure", function() {
- $.fn.msg = mw.jqueryMsg.getPlugin();
- var $div = $( '<div>' ).append( $( '<p>' ).addClass( 'foo' ) );
- $div.find( '.foo' ).msg( 'en_fail' );
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- // a surrounding <SPAN> is needed for html() to work right
- var expectedHtml = $( '<span>en_fail: Parse error at position 20 in input: This should fail to {{parse</span>' ).html();
- var createdHtml = $div.find( '.foo' ).html();
- expect( createdHtml ).toEqual( expectedHtml );
- delete $.fn.msg;
- } );
-
- } );
-
-
-
-
- describe( "test plurals and other language-specific functions", function() {
- /* copying some language definitions in here -- it's hard to make this test fast and reliable
- otherwise, and we don't want to have to know the mediawiki URL from this kind of test either.
- We also can't preload the langs for the test since they clobber the same namespace.
- In principle Roan said it was okay to change how languages worked so that didn't happen... maybe
- someday. We'd have to the same kind of importing of the default rules for most rules, or maybe
- come up with some kind of subclassing scheme for languages */
- var languageClasses = {
- ar: {
- /**
- * Arabic (العربية) language functions
- */
-
- convertPlural: function( count, forms ) {
- forms = mw.language.preConvertPlural( forms, 6 );
- if ( count === 0 ) {
- return forms[0];
- }
- if ( count == 1 ) {
- return forms[1];
- }
- if ( count == 2 ) {
- return forms[2];
- }
- if ( count % 100 >= 3 && count % 100 <= 10 ) {
- return forms[3];
- }
- if ( count % 100 >= 11 && count % 100 <= 99 ) {
- return forms[4];
- }
- return forms[5];
- },
-
- digitTransformTable: {
- '0': '٠', // &#x0660;
- '1': '١', // &#x0661;
- '2': '٢', // &#x0662;
- '3': '٣', // &#x0663;
- '4': '٤', // &#x0664;
- '5': '٥', // &#x0665;
- '6': '٦', // &#x0666;
- '7': '٧', // &#x0667;
- '8': '٨', // &#x0668;
- '9': '٩', // &#x0669;
- '.': '٫', // &#x066b; wrong table ?
- ',': '٬' // &#x066c;
- }
-
- },
- en: { },
- fr: {
- convertPlural: function( count, forms ) {
- forms = mw.language.preConvertPlural( forms, 2 );
- return ( count <= 1 ) ? forms[0] : forms[1];
- }
- },
- jp: { },
- zh: { }
- };
-
- /* simulate how the language classes override, or don't, the standard functions in mw.language */
- $.each( languageClasses, function( langCode, rules ) {
- $.each( [ 'convertPlural', 'convertNumber' ], function( i, propertyName ) {
- if ( typeof rules[ propertyName ] === 'undefined' ) {
- rules[ propertyName ] = mw.language[ propertyName ];
- }
- } );
- } );
-
- $.each( jasmineMsgSpec, function( i, test ) {
- it( "should parse " + test.name, function() {
- // using language override so we don't have to muck with global namespace
- var parser = new mw.jqueryMsg.parser( { language: languageClasses[ test.lang ] } );
- var parsedHtml = parser.parse( test.key, test.args ).html();
- expect( parsedHtml ).toEqual( test.result );
- } );
- } );
-
- } );
-
- } );
-} )( window.mediaWiki, jQuery );
diff --git a/tests/jasmine/spec_makers/makeJqueryMsgSpec.php b/tests/jasmine/spec_makers/makeJqueryMsgSpec.php
deleted file mode 100644
index 840da96a..00000000
--- a/tests/jasmine/spec_makers/makeJqueryMsgSpec.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-/**
- * This PHP script defines the spec that the Javascript message parser should conform to.
- *
- * It does this by looking up the results of various string 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 with the JasmineBDD framework. This specification can then be used by simply including it into
- * the SpecRunner.html file.
- *
- * 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 Jasmine 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.)
- *
- */
-
-$maintenanceDir = dirname( dirname( dirname( __DIR__ ) ) ) . '/maintenance';
-
-require( "$maintenanceDir/Maintenance.php" );
-
-class MakeLanguageSpec 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 JasmineBDD-compatible specification for message parsing";
- // add any other options here
- }
-
- public function execute() {
- list( $messages, $tests ) = $this->getMessagesAndTests();
- $this->writeJavascriptFile( $messages, $tests, "spec/mediawiki.language.parser.spec.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 template, without any transformations
- $template = wfMessage( $key )->inLanguage( $languageCode )->plain();
-
- $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 ) {
- global $argv;
- $arguments = count($argv) ? $argv : $_SERVER[ 'argv' ];
-
- $json = new Services_JSON;
- $json->pretty = true;
- $javascriptPrologue = "// This file stores the results from the PHP parser for certain messages and arguments,\n"
- . "// so we can test the equivalent Javascript libraries.\n"
- . '// Last generated with ' . join(' ', $arguments) . ' at ' . gmdate('c') . "\n\n";
- $javascriptMessages = "mediaWiki.messages.set( " . $json->encode( $messages, true ) . " );\n";
- $javascriptTests = 'var jasmineMsgSpec = ' . $json->encode( $tests, true ) . ";\n";
-
- $fp = fopen( $dataSpecFile, 'w' );
- if ( !$fp ) {
- die( "couldn't open $dataSpecFile for writing" );
- }
- $success = fwrite( $fp, $javascriptPrologue . $javascriptMessages . $javascriptTests );
- if ( !$success ) {
- die( "couldn't write to $dataSpecFile" );
- }
- $success = fclose( $fp );
- if ( !$success ) {
- die( "couldn't close $dataSpecFile" );
- }
- }
-}
-
-$maintClass = "MakeLanguageSpec";
-require_once( "$maintenanceDir/doMaintenance.php" );
-
-
-
diff --git a/tests/parser/README b/tests/parser/README
deleted file mode 100644
index 8b413376..00000000
--- a/tests/parser/README
+++ /dev/null
@@ -1,8 +0,0 @@
-Parser tests are run using our PHPUnit test suite in tests/phpunit:
-
- $ cd tests/phpunit
- ./phpunit.php --group Parser
-
-You can optionally filter by title using --regex. I.e. :
-
- ./phpunit.php --group Parser --regex="Bug 6200"
diff --git a/tests/parser/extraParserTests.txt b/tests/parser/extraParserTests.txt
deleted file mode 100644
index bef8f506..00000000
--- a/tests/parser/extraParserTests.txt
+++ /dev/null
Binary files differ
diff --git a/tests/parser/parserTest.inc b/tests/parser/parserTest.inc
deleted file mode 100644
index 86e1e192..00000000
--- a/tests/parser/parserTest.inc
+++ /dev/null
@@ -1,1330 +0,0 @@
-<?php
-# Copyright (C) 2004, 2010 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
-/**
- * @todo Make this more independent of the configuration (and if possible the database)
- * @todo document
- * @file
- * @ingroup Testing
- */
-
-/**
- * @ingroup Testing
- */
-class ParserTest {
- /**
- * boolean $color whereas output should be colorized
- */
- private $color;
-
- /**
- * boolean $showOutput Show test output
- */
- private $showOutput;
-
- /**
- * boolean $useTemporaryTables Use temporary tables for the temporary database
- */
- private $useTemporaryTables = true;
-
- /**
- * boolean $databaseSetupDone True if the database has been set up
- */
- private $databaseSetupDone = false;
-
- /**
- * Our connection to the database
- * @var DatabaseBase
- */
- private $db;
-
- /**
- * Database clone helper
- * @var CloneDatabase
- */
- private $dbClone;
-
- /**
- * string $oldTablePrefix Original table prefix
- */
- private $oldTablePrefix;
-
- private $maxFuzzTestLength = 300;
- private $fuzzSeed = 0;
- private $memoryLimit = 50;
- private $uploadDir = null;
-
- public $regex = "";
- private $savedGlobals = array();
- /**
- * Sets terminal colorization and diff/quick modes depending on OS and
- * command-line options (--color and --quick).
- */
- public function __construct( $options = array() ) {
- # Only colorize output if stdout is a terminal.
- $this->color = !wfIsWindows() && Maintenance::posix_isatty( 1 );
-
- if ( isset( $options['color'] ) ) {
- switch( $options['color'] ) {
- case 'no':
- $this->color = false;
- break;
- case 'yes':
- default:
- $this->color = true;
- break;
- }
- }
-
- $this->term = $this->color
- ? new AnsiTermColorer()
- : new DummyTermColorer();
-
- $this->showDiffs = !isset( $options['quick'] );
- $this->showProgress = !isset( $options['quiet'] );
- $this->showFailure = !(
- isset( $options['quiet'] )
- && ( isset( $options['record'] )
- || isset( $options['compare'] ) ) ); // redundant output
-
- $this->showOutput = isset( $options['show-output'] );
-
- if ( isset( $options['filter'] ) ) {
- $options['regex'] = $options['filter'];
- }
-
- if ( isset( $options['regex'] ) ) {
- if ( isset( $options['record'] ) ) {
- echo "Warning: --record cannot be used with --regex, disabling --record\n";
- unset( $options['record'] );
- }
- $this->regex = $options['regex'];
- } else {
- # Matches anything
- $this->regex = '';
- }
-
- $this->setupRecorder( $options );
- $this->keepUploads = isset( $options['keep-uploads'] );
-
- if ( isset( $options['seed'] ) ) {
- $this->fuzzSeed = intval( $options['seed'] ) - 1;
- }
-
- $this->runDisabled = isset( $options['run-disabled'] );
-
- $this->hooks = array();
- $this->functionHooks = array();
- self::setUp();
- }
-
- static function setUp() {
- global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
- $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
- $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
- $parserMemc, $wgThumbnailScriptPath, $wgScriptPath,
- $wgArticlePath, $wgStyleSheetPath, $wgScript, $wgStylePath, $wgExtensionAssetsPath,
- $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType, $wgLockManagers;
-
- $wgScript = '/index.php';
- $wgScriptPath = '/';
- $wgArticlePath = '/wiki/$1';
- $wgStyleSheetPath = '/skins';
- $wgStylePath = '/skins';
- $wgExtensionAssetsPath = '/extensions';
- $wgThumbnailScriptPath = false;
- $wgLockManagers = array( array(
- 'name' => 'fsLockManager',
- 'class' => 'FSLockManager',
- 'lockDirectory' => wfTempDir() . '/test-repo/lockdir',
- ) );
- $wgLocalFileRepo = array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'url' => 'http://example.com/images',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- 'backend' => new FSFileBackend( array(
- 'name' => 'local-backend',
- 'lockManager' => 'fsLockManager',
- 'containerPaths' => array(
- 'local-public' => wfTempDir() . '/test-repo/public',
- 'local-thumb' => wfTempDir() . '/test-repo/thumb',
- 'local-temp' => wfTempDir() . '/test-repo/temp',
- 'local-deleted' => wfTempDir() . '/test-repo/deleted',
- )
- ) )
- );
- $wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
- $wgNamespaceAliases['Image'] = NS_FILE;
- $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
-
- // XXX: tests won't run without this (for CACHE_DB)
- if ( $wgMainCacheType === CACHE_DB ) {
- $wgMainCacheType = CACHE_NONE;
- }
- if ( $wgMessageCacheType === CACHE_DB ) {
- $wgMessageCacheType = CACHE_NONE;
- }
- if ( $wgParserCacheType === CACHE_DB ) {
- $wgParserCacheType = CACHE_NONE;
- }
-
- $wgEnableParserCache = false;
- DeferredUpdates::clearPendingUpdates();
- $wgMemc = wfGetMainCache(); // checks $wgMainCacheType
- $messageMemc = wfGetMessageCacheStorage();
- $parserMemc = wfGetParserCacheStorage();
-
- // $wgContLang = new StubContLang;
- $wgUser = new User;
- $context = new RequestContext;
- $wgLang = $context->getLanguage();
- $wgOut = $context->getOutput();
- $wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
- $wgRequest = $context->getRequest();
-
- if ( $wgStyleDirectory === false ) {
- $wgStyleDirectory = "$IP/skins";
- }
-
- }
-
- public function setupRecorder ( $options ) {
- if ( isset( $options['record'] ) ) {
- $this->recorder = new DbTestRecorder( $this );
- $this->recorder->version = isset( $options['setversion'] ) ?
- $options['setversion'] : SpecialVersion::getVersion();
- } elseif ( isset( $options['compare'] ) ) {
- $this->recorder = new DbTestPreviewer( $this );
- } else {
- $this->recorder = new TestRecorder( $this );
- }
- }
-
- /**
- * Remove last character if it is a newline
- * @group utility
- */
- static public function chomp( $s ) {
- if ( substr( $s, -1 ) === "\n" ) {
- return substr( $s, 0, -1 );
- }
- else {
- return $s;
- }
- }
-
- /**
- * Run a fuzz test series
- * Draw input from a set of test files
- */
- function fuzzTest( $filenames ) {
- $GLOBALS['wgContLang'] = Language::factory( 'en' );
- $dict = $this->getFuzzInput( $filenames );
- $dictSize = strlen( $dict );
- $logMaxLength = log( $this->maxFuzzTestLength );
- $this->setupDatabase();
- ini_set( 'memory_limit', $this->memoryLimit * 1048576 );
-
- $numTotal = 0;
- $numSuccess = 0;
- $user = new User;
- $opts = ParserOptions::newFromUser( $user );
- $title = Title::makeTitle( NS_MAIN, 'Parser_test' );
-
- while ( true ) {
- // Generate test input
- mt_srand( ++$this->fuzzSeed );
- $totalLength = mt_rand( 1, $this->maxFuzzTestLength );
- $input = '';
-
- while ( strlen( $input ) < $totalLength ) {
- $logHairLength = mt_rand( 0, 1000000 ) / 1000000 * $logMaxLength;
- $hairLength = min( intval( exp( $logHairLength ) ), $dictSize );
- $offset = mt_rand( 0, $dictSize - $hairLength );
- $input .= substr( $dict, $offset, $hairLength );
- }
-
- $this->setupGlobals();
- $parser = $this->getParser();
-
- // Run the test
- try {
- $parser->parse( $input, $title, $opts );
- $fail = false;
- } catch ( Exception $exception ) {
- $fail = true;
- }
-
- if ( $fail ) {
- echo "Test failed with seed {$this->fuzzSeed}\n";
- echo "Input:\n";
- printf( "string(%d) \"%s\"\n\n", strlen( $input ), $input );
- echo "$exception\n";
- } else {
- $numSuccess++;
- }
-
- $numTotal++;
- $this->teardownGlobals();
- $parser->__destruct();
-
- if ( $numTotal % 100 == 0 ) {
- $usage = intval( memory_get_usage( true ) / $this->memoryLimit / 1048576 * 100 );
- echo "{$this->fuzzSeed}: $numSuccess/$numTotal (mem: $usage%)\n";
- if ( $usage > 90 ) {
- echo "Out of memory:\n";
- $memStats = $this->getMemoryBreakdown();
-
- foreach ( $memStats as $name => $usage ) {
- echo "$name: $usage\n";
- }
- $this->abort();
- }
- }
- }
- }
-
- /**
- * Get an input dictionary from a set of parser test files
- */
- function getFuzzInput( $filenames ) {
- $dict = '';
-
- foreach ( $filenames as $filename ) {
- $contents = file_get_contents( $filename );
- preg_match_all( '/!!\s*input\n(.*?)\n!!\s*result/s', $contents, $matches );
-
- foreach ( $matches[1] as $match ) {
- $dict .= $match . "\n";
- }
- }
-
- return $dict;
- }
-
- /**
- * Get a memory usage breakdown
- */
- function getMemoryBreakdown() {
- $memStats = array();
-
- foreach ( $GLOBALS as $name => $value ) {
- $memStats['$' . $name] = strlen( serialize( $value ) );
- }
-
- $classes = get_declared_classes();
-
- foreach ( $classes as $class ) {
- $rc = new ReflectionClass( $class );
- $props = $rc->getStaticProperties();
- $memStats[$class] = strlen( serialize( $props ) );
- $methods = $rc->getMethods();
-
- foreach ( $methods as $method ) {
- $memStats[$class] += strlen( serialize( $method->getStaticVariables() ) );
- }
- }
-
- $functions = get_defined_functions();
-
- foreach ( $functions['user'] as $function ) {
- $rf = new ReflectionFunction( $function );
- $memStats["$function()"] = strlen( serialize( $rf->getStaticVariables() ) );
- }
-
- asort( $memStats );
-
- return $memStats;
- }
-
- function abort() {
- $this->abort();
- }
-
- /**
- * Run a series of tests listed in the given text files.
- * Each test consists of a brief description, wikitext input,
- * and the expected HTML output.
- *
- * Prints status updates on stdout and counts up the total
- * number and percentage of passed tests.
- *
- * @param $filenames Array of strings
- * @return Boolean: true if passed all tests, false if any tests failed.
- */
- public function runTestsFromFiles( $filenames ) {
- $ok = false;
- $GLOBALS['wgContLang'] = Language::factory( 'en' );
- $this->recorder->start();
- try {
- $this->setupDatabase();
- $ok = true;
-
- foreach ( $filenames as $filename ) {
- $tests = new TestFileIterator( $filename, $this );
- $ok = $this->runTests( $tests ) && $ok;
- }
-
- $this->teardownDatabase();
- $this->recorder->report();
- } catch (DBError $e) {
- echo $e->getMessage();
- }
- $this->recorder->end();
-
- return $ok;
- }
-
- function runTests( $tests ) {
- $ok = true;
-
- foreach ( $tests as $t ) {
- $result =
- $this->runTest( $t['test'], $t['input'], $t['result'], $t['options'], $t['config'] );
- $ok = $ok && $result;
- $this->recorder->record( $t['test'], $result );
- }
-
- if ( $this->showProgress ) {
- print "\n";
- }
-
- return $ok;
- }
-
- /**
- * Get a Parser object
- */
- function getParser( $preprocessor = null ) {
- global $wgParserConf;
-
- $class = $wgParserConf['class'];
- $parser = new $class( array( 'preprocessorClass' => $preprocessor ) + $wgParserConf );
-
- foreach ( $this->hooks as $tag => $callback ) {
- $parser->setHook( $tag, $callback );
- }
-
- foreach ( $this->functionHooks as $tag => $bits ) {
- list( $callback, $flags ) = $bits;
- $parser->setFunctionHook( $tag, $callback, $flags );
- }
-
- wfRunHooks( 'ParserTestParser', array( &$parser ) );
-
- return $parser;
- }
-
- /**
- * Run a given wikitext input through a freshly-constructed wiki parser,
- * and compare the output against the expected results.
- * Prints status and explanatory messages to stdout.
- *
- * @param $desc String: test's description
- * @param $input String: wikitext to try rendering
- * @param $result String: result to output
- * @param $opts Array: test's options
- * @param $config String: overrides for global variables, one per line
- * @return Boolean
- */
- public function runTest( $desc, $input, $result, $opts, $config ) {
- if ( $this->showProgress ) {
- $this->showTesting( $desc );
- }
-
- $opts = $this->parseOptions( $opts );
- $context = $this->setupGlobals( $opts, $config );
-
- $user = $context->getUser();
- $options = ParserOptions::newFromContext( $context );
-
- if ( isset( $opts['title'] ) ) {
- $titleText = $opts['title'];
- }
- else {
- $titleText = 'Parser test';
- }
-
- $local = isset( $opts['local'] );
- $preprocessor = isset( $opts['preprocessor'] ) ? $opts['preprocessor'] : null;
- $parser = $this->getParser( $preprocessor );
- $title = Title::newFromText( $titleText );
-
- if ( isset( $opts['pst'] ) ) {
- $out = $parser->preSaveTransform( $input, $title, $user, $options );
- } elseif ( isset( $opts['msg'] ) ) {
- $out = $parser->transformMsg( $input, $options, $title );
- } elseif ( isset( $opts['section'] ) ) {
- $section = $opts['section'];
- $out = $parser->getSection( $input, $section );
- } elseif ( isset( $opts['replace'] ) ) {
- $section = $opts['replace'][0];
- $replace = $opts['replace'][1];
- $out = $parser->replaceSection( $input, $section, $replace );
- } elseif ( isset( $opts['comment'] ) ) {
- $out = Linker::formatComment( $input, $title, $local );
- } elseif ( isset( $opts['preload'] ) ) {
- $out = $parser->getpreloadText( $input, $title, $options );
- } else {
- $output = $parser->parse( $input, $title, $options, true, true, 1337 );
- $out = $output->getText();
-
- if ( isset( $opts['showtitle'] ) ) {
- if ( $output->getTitleText() ) {
- $title = $output->getTitleText();
- }
-
- $out = "$title\n$out";
- }
-
- if ( isset( $opts['ill'] ) ) {
- $out = $this->tidy( implode( ' ', $output->getLanguageLinks() ) );
- } elseif ( isset( $opts['cat'] ) ) {
- $outputPage = $context->getOutput();
- $outputPage->addCategoryLinks( $output->getCategories() );
- $cats = $outputPage->getCategoryLinks();
-
- if ( isset( $cats['normal'] ) ) {
- $out = $this->tidy( implode( ' ', $cats['normal'] ) );
- } else {
- $out = '';
- }
- }
-
- $result = $this->tidy( $result );
- }
-
- $this->teardownGlobals();
- return $this->showTestResult( $desc, $result, $out );
- }
-
- /**
- *
- */
- function showTestResult( $desc, $result, $out ) {
- if ( $result === $out ) {
- $this->showSuccess( $desc );
- return true;
- } else {
- $this->showFailure( $desc, $result, $out );
- return false;
- }
- }
-
- /**
- * Use a regex to find out the value of an option
- * @param $key String: name of option val to retrieve
- * @param $opts Options array to look in
- * @param $default Mixed: default value returned if not found
- */
- private static function getOptionValue( $key, $opts, $default ) {
- $key = strtolower( $key );
-
- if ( isset( $opts[$key] ) ) {
- return $opts[$key];
- } else {
- return $default;
- }
- }
-
- private function parseOptions( $instring ) {
- $opts = array();
- // foo
- // foo=bar
- // foo="bar baz"
- // foo=[[bar baz]]
- // foo=bar,"baz quux"
- $regex = '/\b
- ([\w-]+) # Key
- \b
- (?:\s*
- = # First sub-value
- \s*
- (
- "
- [^"]* # Quoted val
- "
- |
- \[\[
- [^]]* # Link target
- \]\]
- |
- [\w-]+ # Plain word
- )
- (?:\s*
- , # Sub-vals 1..N
- \s*
- (
- "[^"]*" # Quoted val
- |
- \[\[[^]]*\]\] # Link target
- |
- [\w-]+ # Plain word
- )
- )*
- )?
- /x';
-
- if ( preg_match_all( $regex, $instring, $matches, PREG_SET_ORDER ) ) {
- foreach ( $matches as $bits ) {
- array_shift( $bits );
- $key = strtolower( array_shift( $bits ) );
- if ( count( $bits ) == 0 ) {
- $opts[$key] = true;
- } elseif ( count( $bits ) == 1 ) {
- $opts[$key] = $this->cleanupOption( array_shift( $bits ) );
- } else {
- // Array!
- $opts[$key] = array_map( array( $this, 'cleanupOption' ), $bits );
- }
- }
- }
- return $opts;
- }
-
- private function cleanupOption( $opt ) {
- if ( substr( $opt, 0, 1 ) == '"' ) {
- return substr( $opt, 1, -1 );
- }
-
- if ( substr( $opt, 0, 2 ) == '[[' ) {
- return substr( $opt, 2, -2 );
- }
- return $opt;
- }
-
- /**
- * Set up the global variables for a consistent environment for each test.
- * Ideally this should replace the global configuration entirely.
- */
- private function setupGlobals( $opts = '', $config = '' ) {
- # Find out values for some special options.
- $lang =
- self::getOptionValue( 'language', $opts, 'en' );
- $variant =
- self::getOptionValue( 'variant', $opts, false );
- $maxtoclevel =
- self::getOptionValue( 'wgMaxTocLevel', $opts, 999 );
- $linkHolderBatchSize =
- self::getOptionValue( 'wgLinkHolderBatchSize', $opts, 1000 );
-
- $settings = array(
- 'wgServer' => 'http://Britney-Spears',
- 'wgScript' => '/index.php',
- 'wgScriptPath' => '/',
- 'wgArticlePath' => '/wiki/$1',
- 'wgActionPaths' => array(),
- 'wgLockManagers' => array(
- 'name' => 'fsLockManager',
- 'class' => 'FSLockManager',
- 'lockDirectory' => $this->uploadDir . '/lockdir',
- ),
- 'wgLocalFileRepo' => array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'url' => 'http://example.com/images',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- 'backend' => new FSFileBackend( array(
- 'name' => 'local-backend',
- 'lockManager' => 'fsLockManager',
- 'containerPaths' => array(
- 'local-public' => $this->uploadDir,
- 'local-thumb' => $this->uploadDir . '/thumb',
- 'local-temp' => $this->uploadDir . '/temp',
- 'local-deleted' => $this->uploadDir . '/delete',
- )
- ) )
- ),
- 'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
- 'wgStylePath' => '/skins',
- 'wgStyleSheetPath' => '/skins',
- 'wgSitename' => 'MediaWiki',
- 'wgLanguageCode' => $lang,
- 'wgDBprefix' => $this->db->getType() != 'oracle' ? 'parsertest_' : 'pt_',
- 'wgRawHtml' => isset( $opts['rawhtml'] ),
- 'wgLang' => null,
- 'wgContLang' => null,
- 'wgNamespacesWithSubpages' => array( 0 => isset( $opts['subpage'] ) ),
- 'wgMaxTocLevel' => $maxtoclevel,
- 'wgCapitalLinks' => true,
- 'wgNoFollowLinks' => true,
- 'wgNoFollowDomainExceptions' => array(),
- 'wgThumbnailScriptPath' => false,
- 'wgUseImageResize' => false,
- 'wgLocaltimezone' => 'UTC',
- 'wgAllowExternalImages' => true,
- 'wgUseTidy' => false,
- 'wgDefaultLanguageVariant' => $variant,
- 'wgVariantArticlePath' => false,
- 'wgGroupPermissions' => array( '*' => array(
- 'createaccount' => true,
- 'read' => true,
- 'edit' => true,
- 'createpage' => true,
- 'createtalk' => true,
- ) ),
- 'wgNamespaceProtection' => array( NS_MEDIAWIKI => 'editinterface' ),
- 'wgDefaultExternalStore' => array(),
- 'wgForeignFileRepos' => array(),
- 'wgLinkHolderBatchSize' => $linkHolderBatchSize,
- 'wgExperimentalHtmlIds' => false,
- 'wgExternalLinkTarget' => false,
- 'wgAlwaysUseTidy' => false,
- 'wgHtml5' => true,
- 'wgWellFormedXml' => true,
- 'wgAllowMicrodataAttributes' => true,
- 'wgAdaptiveMessageCache' => true,
- 'wgDisableLangConversion' => false,
- 'wgDisableTitleConversion' => false,
- );
-
- if ( $config ) {
- $configLines = explode( "\n", $config );
-
- foreach ( $configLines as $line ) {
- list( $var, $value ) = explode( '=', $line, 2 );
-
- $settings[$var] = eval( "return $value;" );
- }
- }
-
- $this->savedGlobals = array();
-
- /** @since 1.20 */
- wfRunHooks( 'ParserTestGlobals', array( &$settings ) );
-
- foreach ( $settings as $var => $val ) {
- if ( array_key_exists( $var, $GLOBALS ) ) {
- $this->savedGlobals[$var] = $GLOBALS[$var];
- }
-
- $GLOBALS[$var] = $val;
- }
-
- $GLOBALS['wgContLang'] = Language::factory( $lang );
- $GLOBALS['wgMemc'] = new EmptyBagOStuff;
-
- $context = new RequestContext();
- $GLOBALS['wgLang'] = $context->getLanguage();
- $GLOBALS['wgOut'] = $context->getOutput();
-
- $GLOBALS['wgUser'] = new User();
-
- global $wgHooks;
-
- $wgHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
- $wgHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
-
- MagicWord::clearCache();
-
- return $context;
- }
-
- /**
- * List of temporary tables to create, without prefix.
- * Some of these probably aren't necessary.
- */
- private function listTables() {
- $tables = array( 'user', 'user_properties', 'user_former_groups', 'page', 'page_restrictions',
- 'protected_titles', 'revision', 'text', 'pagelinks', 'imagelinks',
- 'categorylinks', 'templatelinks', 'externallinks', 'langlinks', 'iwlinks',
- 'site_stats', 'hitcounter', 'ipblocks', 'image', 'oldimage',
- 'recentchanges', 'watchlist', 'interwiki', 'logging',
- 'querycache', 'objectcache', 'job', 'l10n_cache', 'redirect', 'querycachetwo',
- 'archive', 'user_groups', 'page_props', 'category', 'msg_resource', 'msg_resource_links'
- );
-
- if ( in_array( $this->db->getType(), array( 'mysql', 'sqlite', 'oracle' ) ) ) {
- array_push( $tables, 'searchindex' );
- }
-
- // Allow extensions to add to the list of tables to duplicate;
- // may be necessary if they hook into page save or other code
- // which will require them while running tests.
- wfRunHooks( 'ParserTestTables', array( &$tables ) );
-
- return $tables;
- }
-
- /**
- * Set up a temporary set of wiki tables to work with for the tests.
- * Currently this will only be done once per run, and any changes to
- * the db will be visible to later tests in the run.
- */
- public function setupDatabase() {
- global $wgDBprefix;
-
- if ( $this->databaseSetupDone ) {
- return;
- }
-
- $this->db = wfGetDB( DB_MASTER );
- $dbType = $this->db->getType();
-
- if ( $wgDBprefix === 'parsertest_' || ( $dbType == 'oracle' && $wgDBprefix === 'pt_' ) ) {
- throw new MWException( 'setupDatabase should be called before setupGlobals' );
- }
-
- $this->databaseSetupDone = true;
- $this->oldTablePrefix = $wgDBprefix;
-
- # SqlBagOStuff broke when using temporary tables on r40209 (bug 15892).
- # It seems to have been fixed since (r55079?), but regressed at some point before r85701.
- # This works around it for now...
- ObjectCache::$instances[CACHE_DB] = new HashBagOStuff;
-
- # CREATE TEMPORARY TABLE breaks if there is more than one server
- if ( wfGetLB()->getServerCount() != 1 ) {
- $this->useTemporaryTables = false;
- }
-
- $temporary = $this->useTemporaryTables || $dbType == 'postgres';
- $prefix = $dbType != 'oracle' ? 'parsertest_' : 'pt_';
-
- $this->dbClone = new CloneDatabase( $this->db, $this->listTables(), $prefix );
- $this->dbClone->useTemporaryTables( $temporary );
- $this->dbClone->cloneTableStructure();
-
- if ( $dbType == 'oracle' ) {
- $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
- # Insert 0 user to prevent FK violations
-
- # Anonymous user
- $this->db->insert( 'user', array(
- 'user_id' => 0,
- 'user_name' => 'Anonymous' ) );
- }
-
- # Hack: insert a few Wikipedia in-project interwiki prefixes,
- # for testing inter-language links
- $this->db->insert( 'interwiki', array(
- array( 'iw_prefix' => 'wikipedia',
- 'iw_url' => 'http://en.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 0 ),
- array( 'iw_prefix' => 'meatball',
- 'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 0 ),
- array( 'iw_prefix' => 'zh',
- 'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'es',
- 'iw_url' => 'http://es.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'fr',
- 'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'ru',
- 'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- ) );
-
- # Update certain things in site_stats
- $this->db->insert( 'site_stats', array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ) );
-
- # Reinitialise the LocalisationCache to match the database state
- Language::getLocalisationCache()->unloadAll();
-
- # Clear the message cache
- MessageCache::singleton()->clear();
-
- $this->uploadDir = $this->setupUploadDir();
- $user = User::createNew( 'WikiSysop' );
- $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
- $image->recordUpload2( '', 'Upload of some lame file', 'Some lame file', array(
- 'size' => 12345,
- 'width' => 1941,
- 'height' => 220,
- 'bits' => 24,
- 'media_type' => MEDIATYPE_BITMAP,
- 'mime' => 'image/jpeg',
- 'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
- 'fileExists' => true
- ), $this->db->timestamp( '20010115123500' ), $user );
-
- # This image will be blacklisted in [[MediaWiki:Bad image list]]
- $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
- $image->recordUpload2( '', 'zomgnotcensored', 'Borderline image', array(
- 'size' => 12345,
- 'width' => 320,
- 'height' => 240,
- 'bits' => 24,
- 'media_type' => MEDIATYPE_BITMAP,
- 'mime' => 'image/jpeg',
- 'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
- 'fileExists' => true
- ), $this->db->timestamp( '20010115123500' ), $user );
- }
-
- public function teardownDatabase() {
- if ( !$this->databaseSetupDone ) {
- $this->teardownGlobals();
- return;
- }
- $this->teardownUploadDir( $this->uploadDir );
-
- $this->dbClone->destroy();
- $this->databaseSetupDone = false;
-
- if ( $this->useTemporaryTables ) {
- if( $this->db->getType() == 'sqlite' ) {
- # Under SQLite the searchindex table is virtual and need
- # to be explicitly destroyed. See bug 29912
- # See also MediaWikiTestCase::destroyDB()
- wfDebug( __METHOD__ . " explicitly destroying sqlite virtual table parsertest_searchindex\n" );
- $this->db->query( "DROP TABLE `parsertest_searchindex`" );
- }
- # Don't need to do anything
- $this->teardownGlobals();
- return;
- }
-
- $tables = $this->listTables();
-
- foreach ( $tables as $table ) {
- $sql = $this->db->getType() == 'oracle' ? "DROP TABLE pt_$table DROP CONSTRAINTS" : "DROP TABLE `parsertest_$table`";
- $this->db->query( $sql );
- }
-
- if ( $this->db->getType() == 'oracle' )
- $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
-
- $this->teardownGlobals();
- }
-
- /**
- * Create a dummy uploads directory which will contain a couple
- * of files in order to pass existence tests.
- *
- * @return String: the directory
- */
- private function setupUploadDir() {
- global $IP;
-
- if ( $this->keepUploads ) {
- $dir = wfTempDir() . '/mwParser-images';
-
- if ( is_dir( $dir ) ) {
- return $dir;
- }
- } else {
- $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
- }
-
- // wfDebug( "Creating upload directory $dir\n" );
- if ( file_exists( $dir ) ) {
- wfDebug( "Already exists!\n" );
- return $dir;
- }
-
- wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
- wfMkdirParents( $dir . '/0/09', null, __METHOD__ );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
-
- return $dir;
- }
-
- /**
- * Restore default values and perform any necessary clean-up
- * after each test runs.
- */
- private function teardownGlobals() {
- RepoGroup::destroySingleton();
- FileBackendGroup::destroySingleton();
- LockManagerGroup::destroySingleton();
- LinkCache::singleton()->clear();
-
- foreach ( $this->savedGlobals as $var => $val ) {
- $GLOBALS[$var] = $val;
- }
- }
-
- /**
- * Remove the dummy uploads directory
- */
- private function teardownUploadDir( $dir ) {
- if ( $this->keepUploads ) {
- return;
- }
-
- // delete the files first, then the dirs.
- self::deleteFiles(
- array (
- "$dir/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
-
- "$dir/0/09/Bad.jpg",
-
- "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
- )
- );
-
- self::deleteDirs(
- array (
- "$dir/3/3a",
- "$dir/3",
- "$dir/thumb/6/65",
- "$dir/thumb/6",
- "$dir/thumb/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a",
- "$dir/thumb/3",
-
- "$dir/0/09/",
- "$dir/0/",
- "$dir/thumb",
- "$dir/math/f/a/5",
- "$dir/math/f/a",
- "$dir/math/f",
- "$dir/math",
- "$dir",
- )
- );
- }
-
- /**
- * Delete the specified files, if they exist.
- * @param $files Array: full paths to files to delete.
- */
- private static function deleteFiles( $files ) {
- foreach ( $files as $file ) {
- if ( file_exists( $file ) ) {
- unlink( $file );
- }
- }
- }
-
- /**
- * Delete the specified directories, if they exist. Must be empty.
- * @param $dirs Array: full paths to directories to delete.
- */
- private static function deleteDirs( $dirs ) {
- foreach ( $dirs as $dir ) {
- if ( is_dir( $dir ) ) {
- rmdir( $dir );
- }
- }
- }
-
- /**
- * "Running test $desc..."
- */
- protected function showTesting( $desc ) {
- print "Running test $desc... ";
- }
-
- /**
- * Print a happy success message.
- *
- * @param $desc String: the test name
- * @return Boolean
- */
- protected function showSuccess( $desc ) {
- if ( $this->showProgress ) {
- print $this->term->color( '1;32' ) . 'PASSED' . $this->term->reset() . "\n";
- }
-
- return true;
- }
-
- /**
- * Print a failure message and provide some explanatory output
- * about what went wrong if so configured.
- *
- * @param $desc String: the test name
- * @param $result String: expected HTML output
- * @param $html String: actual HTML output
- * @return Boolean
- */
- protected function showFailure( $desc, $result, $html ) {
- if ( $this->showFailure ) {
- if ( !$this->showProgress ) {
- # In quiet mode we didn't show the 'Testing' message before the
- # test, in case it succeeded. Show it now:
- $this->showTesting( $desc );
- }
-
- print $this->term->color( '31' ) . 'FAILED!' . $this->term->reset() . "\n";
-
- if ( $this->showOutput ) {
- print "--- Expected ---\n$result\n--- Actual ---\n$html\n";
- }
-
- if ( $this->showDiffs ) {
- print $this->quickDiff( $result, $html );
- if ( !$this->wellFormed( $html ) ) {
- print "XML error: $this->mXmlError\n";
- }
- }
- }
-
- return false;
- }
-
- /**
- * Run given strings through a diff and return the (colorized) output.
- * Requires writable /tmp directory and a 'diff' command in the PATH.
- *
- * @param $input String
- * @param $output String
- * @param $inFileTail String: tailing for the input file name
- * @param $outFileTail String: tailing for the output file name
- * @return String
- */
- protected function quickDiff( $input, $output, $inFileTail = 'expected', $outFileTail = 'actual' ) {
- # Windows, or at least the fc utility, is retarded
- $slash = wfIsWindows() ? '\\' : '/';
- $prefix = wfTempDir() . "{$slash}mwParser-" . mt_rand();
-
- $infile = "$prefix-$inFileTail";
- $this->dumpToFile( $input, $infile );
-
- $outfile = "$prefix-$outFileTail";
- $this->dumpToFile( $output, $outfile );
-
- $shellInfile = wfEscapeShellArg($infile);
- $shellOutfile = wfEscapeShellArg($outfile);
-
- global $wgDiff3;
- // we assume that people with diff3 also have usual diff
- $diff = ( wfIsWindows() && !$wgDiff3 )
- ? `fc $shellInfile $shellOutfile`
- : `diff -au $shellInfile $shellOutfile`;
- unlink( $infile );
- unlink( $outfile );
-
- return $this->colorDiff( $diff );
- }
-
- /**
- * Write the given string to a file, adding a final newline.
- *
- * @param $data String
- * @param $filename String
- */
- private function dumpToFile( $data, $filename ) {
- $file = fopen( $filename, "wt" );
- fwrite( $file, $data . "\n" );
- fclose( $file );
- }
-
- /**
- * Colorize unified diff output if set for ANSI color output.
- * Subtractions are colored blue, additions red.
- *
- * @param $text String
- * @return String
- */
- protected function colorDiff( $text ) {
- return preg_replace(
- array( '/^(-.*)$/m', '/^(\+.*)$/m' ),
- array( $this->term->color( 34 ) . '$1' . $this->term->reset(),
- $this->term->color( 31 ) . '$1' . $this->term->reset() ),
- $text );
- }
-
- /**
- * Show "Reading tests from ..."
- *
- * @param $path String
- */
- public function showRunFile( $path ) {
- print $this->term->color( 1 ) .
- "Reading tests from \"$path\"..." .
- $this->term->reset() .
- "\n";
- }
-
- /**
- * Insert a temporary test article
- * @param $name String: the title, including any prefix
- * @param $text String: the article text
- * @param $line Integer: the input line number, for reporting errors
- * @param $ignoreDuplicate Boolean: whether to silently ignore duplicate pages
- */
- static public function addArticle( $name, $text, $line = 'unknown', $ignoreDuplicate = '' ) {
- global $wgCapitalLinks;
-
- $oldCapitalLinks = $wgCapitalLinks;
- $wgCapitalLinks = true; // We only need this from SetupGlobals() See r70917#c8637
-
- $text = self::chomp( $text );
- $name = self::chomp( $name );
-
- $title = Title::newFromText( $name );
-
- if ( is_null( $title ) ) {
- throw new MWException( "invalid title '$name' at line $line\n" );
- }
-
- $page = WikiPage::factory( $title );
- $page->loadPageData( 'fromdbmaster' );
-
- if ( $page->exists() ) {
- if ( $ignoreDuplicate == 'ignoreduplicate' ) {
- return;
- } else {
- throw new MWException( "duplicate article '$name' at line $line\n" );
- }
- }
-
- $page->doEdit( $text, '', EDIT_NEW );
-
- $wgCapitalLinks = $oldCapitalLinks;
- }
-
- /**
- * Steal a callback function from the primary parser, save it for
- * application to our scary parser. If the hook is not installed,
- * abort processing of this file.
- *
- * @param $name String
- * @return Bool true if tag hook is present
- */
- public function requireHook( $name ) {
- global $wgParser;
-
- $wgParser->firstCallInit( ); // make sure hooks are loaded.
-
- if ( isset( $wgParser->mTagHooks[$name] ) ) {
- $this->hooks[$name] = $wgParser->mTagHooks[$name];
- } else {
- echo " This test suite requires the '$name' hook extension, skipping.\n";
- return false;
- }
-
- return true;
- }
-
- /**
- * Steal a callback function from the primary parser, save it for
- * application to our scary parser. If the hook is not installed,
- * abort processing of this file.
- *
- * @param $name String
- * @return Bool true if function hook is present
- */
- public function requireFunctionHook( $name ) {
- global $wgParser;
-
- $wgParser->firstCallInit( ); // make sure hooks are loaded.
-
- if ( isset( $wgParser->mFunctionHooks[$name] ) ) {
- $this->functionHooks[$name] = $wgParser->mFunctionHooks[$name];
- } else {
- echo " This test suite requires the '$name' function hook extension, skipping.\n";
- return false;
- }
-
- return true;
- }
-
- /**
- * Run the "tidy" command on text if the $wgUseTidy
- * global is true
- *
- * @param $text String: the text to tidy
- * @return String
- */
- private function tidy( $text ) {
- global $wgUseTidy;
-
- if ( $wgUseTidy ) {
- $text = MWTidy::tidy( $text );
- }
-
- return $text;
- }
-
- private function wellFormed( $text ) {
- $html =
- Sanitizer::hackDocType() .
- '<html>' .
- $text .
- '</html>';
-
- $parser = xml_parser_create( "UTF-8" );
-
- # case folding violates XML standard, turn it off
- xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
-
- if ( !xml_parse( $parser, $html, true ) ) {
- $err = xml_error_string( xml_get_error_code( $parser ) );
- $position = xml_get_current_byte_index( $parser );
- $fragment = $this->extractFragment( $html, $position );
- $this->mXmlError = "$err at byte $position:\n$fragment";
- xml_parser_free( $parser );
-
- return false;
- }
-
- xml_parser_free( $parser );
-
- return true;
- }
-
- private function extractFragment( $text, $position ) {
- $start = max( 0, $position - 10 );
- $before = $position - $start;
- $fragment = '...' .
- $this->term->color( 34 ) .
- substr( $text, $start, $before ) .
- $this->term->color( 0 ) .
- $this->term->color( 31 ) .
- $this->term->color( 1 ) .
- substr( $text, $position, 1 ) .
- $this->term->color( 0 ) .
- $this->term->color( 34 ) .
- substr( $text, $position + 1, 9 ) .
- $this->term->color( 0 ) .
- '...';
- $display = str_replace( "\n", ' ', $fragment );
- $caret = ' ' .
- str_repeat( ' ', $before ) .
- $this->term->color( 31 ) .
- '^' .
- $this->term->color( 0 );
-
- return "$display\n$caret";
- }
-
- static function getFakeTimestamp( &$parser, &$ts ) {
- $ts = 123;
- return true;
- }
-}
diff --git a/tests/parser/parserTests.txt b/tests/parser/parserTests.txt
deleted file mode 100644
index df057248..00000000
--- a/tests/parser/parserTests.txt
+++ /dev/null
@@ -1,10363 +0,0 @@
-# MediaWiki Parser test cases
-# Some taken from http://meta.wikimedia.org/wiki/Parser_testing
-# All (C) their respective authors and released under the GPL
-#
-# The syntax should be fairly self-explanatory.
-#
-# Currently supported test options:
-# One of the following three:
-#
-# (default) generate HTML output
-# pst apply pre-save transform
-# msg apply message transform
-#
-# Plus any combination of these:
-#
-# cat add category links
-# ill add inter-language links
-# subpage enable subpages (disabled by default)
-# noxml don't check for XML well formdness
-# title=[[XXX]] run test using article title XXX
-# language=XXX set content language to XXX for this test
-# variant=XXX set the variant of language for this test (eg zh-tw)
-# disabled do not run test
-# showtitle make the first line the title
-# comment run through Linker::formatComment() instead of main parser
-# local format section links in edit comment text as local links
-#
-# For testing purposes, temporary articles can created:
-# !!article / NAMESPACE:TITLE / !!text / ARTICLE TEXT / !!endarticle
-# where '/' denotes a newline.
-
-# This is the standard article assumed to exist.
-!! article
-Main Page
-!! text
-blah blah
-!! endarticle
-
-!!article
-Template:Foo
-!!text
-FOO
-!!endarticle
-
-!! article
-Template:Blank
-!! text
-!! endarticle
-
-!! article
-Template:!
-!! text
-|
-!! endarticle
-
-!!article
-MediaWiki:bad image list
-!!text
-* [[File:Bad.jpg]] except [[Nasty page]]
-!!endarticle
-
-!! article
-Template:inner list
-!! text
-* item 1
-!! endarticle
-
-###
-### Basic tests
-###
-!! test
-Blank input
-!! input
-!! result
-!! end
-
-
-!! test
-Simple paragraph
-!! input
-This is a simple paragraph.
-!! result
-<p>This is a simple paragraph.
-</p>
-!! end
-
-!! test
-Paragraphs with extra newline spacing
-!! input
-foo
-
-bar
-
-
-baz
-
-
-
-booz
-!! result
-<p>foo
-</p><p>bar
-</p><p><br />
-baz
-</p><p><br />
-</p><p>booz
-</p>
-!! end
-
-!! test
-Simple list
-!! input
-* Item 1
-* Item 2
-!! result
-<ul><li> Item 1
-</li><li> Item 2
-</li></ul>
-
-!! end
-
-!! test
-Italics and bold
-!! input
-* plain
-* plain''italic''plain
-* plain''italic''plain''italic''plain
-* plain'''bold'''plain
-* plain'''bold'''plain'''bold'''plain
-* plain''italic''plain'''bold'''plain
-* plain'''bold'''plain''italic''plain
-* plain''italic'''bold-italic'''italic''plain
-* plain'''bold''bold-italic''bold'''plain
-* plain'''''bold-italic'''italic''plain
-* plain'''''bold-italic''bold'''plain
-* plain''italic'''bold-italic'''''plain
-* plain'''bold''bold-italic'''''plain
-* plain l'''italic''plain
-* plain l''''bold''' plain
-!! result
-<ul><li> plain
-</li><li> plain<i>italic</i>plain
-</li><li> plain<i>italic</i>plain<i>italic</i>plain
-</li><li> plain<b>bold</b>plain
-</li><li> plain<b>bold</b>plain<b>bold</b>plain
-</li><li> plain<i>italic</i>plain<b>bold</b>plain
-</li><li> plain<b>bold</b>plain<i>italic</i>plain
-</li><li> plain<i>italic<b>bold-italic</b>italic</i>plain
-</li><li> plain<b>bold<i>bold-italic</i>bold</b>plain
-</li><li> plain<i><b>bold-italic</b>italic</i>plain
-</li><li> plain<b><i>bold-italic</i>bold</b>plain
-</li><li> plain<i>italic<b>bold-italic</b></i>plain
-</li><li> plain<b>bold<i>bold-italic</i></b>plain
-</li><li> plain l'<i>italic</i>plain
-</li><li> plain l'<b>bold</b> plain
-</li></ul>
-
-!! end
-
-###
-### 2-quote opening sequence tests
-###
-!! test
-Italics and bold: 2-quote opening sequence: (2,2)
-!! input
-''foo''
-!! result
-<p><i>foo</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 2-quote opening sequence: (2,3)
-!! input
-''foo'''
-!! result
-<p><i>foo'</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 2-quote opening sequence: (2,4)
-!! input
-''foo''''
-!! result
-<p><i>foo''</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 2-quote opening sequence: (2,5)
-!! input
-''foo'''''
-!! result
-<p><i>foo</i>
-</p>
-!!end
-
-
-###
-### 3-quote opening sequence tests
-###
-
-!! test
-Italics and bold: 3-quote opening sequence: (3,2)
-!! input
-'''foo''
-!! result
-<p>'<i>foo</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 3-quote opening sequence: (3,3)
-!! input
-'''foo'''
-!! result
-<p><b>foo</b>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 3-quote opening sequence: (3,4)
-!! input
-'''foo''''
-!! result
-<p><b>foo'</b>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 3-quote opening sequence: (3,5)
-!! input
-'''foo'''''
-!! result
-<p><b>foo</b>
-</p>
-!!end
-
-
-###
-### 4-quote opening sequence tests
-###
-
-!! test
-Italics and bold: 4-quote opening sequence: (4,2)
-!! input
-''''foo''
-!! result
-<p>''<i>foo</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 4-quote opening sequence: (4,3)
-!! input
-''''foo'''
-!! result
-<p>'<b>foo</b>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 4-quote opening sequence: (4,4)
-!! input
-''''foo''''
-!! result
-<p>'<b>foo'</b>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 4-quote opening sequence: (4,5)
-!! input
-''''foo'''''
-!! result
-<p>'<b>foo</b>
-</p>
-!!end
-
-
-###
-### 5-quote opening sequence tests
-###
-
-!! test
-Italics and bold: 5-quote opening sequence: (5,2)
-!! input
-'''''foo''
-!! result
-<p><b><i>foo</i></b>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 5-quote opening sequence: (5,3)
-!! input
-'''''foo'''
-!! result
-<p><i><b>foo</b></i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 5-quote opening sequence: (5,4)
-!! input
-'''''foo''''
-!! result
-<p><i><b>foo'</b></i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 5-quote opening sequence: (5,5)
-!! input
-'''''foo'''''
-!! result
-<p><i><b>foo</b></i>
-</p>
-!!end
-
-###
-### multiple quote sequences in a line
-###
-!! test
-Italics and bold: multiple quote sequences: (2,4,2)
-!! input
-''foo''''bar''
-!! result
-<p><i>foo'<b>bar</b></i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: multiple quote sequences: (2,4,3)
-!! input
-''foo''''bar'''
-!! result
-<p><i>foo'<b>bar</b></i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: multiple quote sequences: (2,4,4)
-!! input
-''foo''''bar''''
-!! result
-<p><i>foo'<b>bar'</b></i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: multiple quote sequences: (3,4,2)
-!! input
-'''foo''''bar''
-!! result
-<p><b>foo'</b>bar
-</p>
-!!end
-
-
-!! test
-Italics and bold: multiple quote sequences: (3,4,3)
-!! input
-'''foo''''bar'''
-!! result
-<p><b>foo'</b>bar
-</p>
-!!end
-
-###
-### other quote tests
-###
-!! test
-Italics and bold: other quote tests: (2,3,5)
-!! input
-''this is about '''foo's family'''''
-!! result
-<p><i>this is about <b>foo's family</b></i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: other quote tests: (2,(3,3),2)
-!! input
-''this is about '''foo's''' family''
-!! result
-<p><i>this is about <b>foo's</b> family</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: other quote tests: (3,2,3,2)
-!! input
-'''this is about ''foo'''s family''
-!! result
-<p><b>this is about <i>foo</i></b><i>s family</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: other quote tests: (3,2,3,3)
-!! input
-'''this is about ''foo'''s family'''
-!! result
-<p>'<i>this is about </i>foo<b>s family</b>
-</p>
-!!end
-
-
-
-!! test
-Italics and bold: other quote tests: (3,(2,2),3)
-!! input
-'''this is about ''foo's'' family'''
-!! result
-<p><b>this is about <i>foo's</i> family</b>
-</p>
-!!end
-
-###
-### <nowiki> test cases
-###
-
-!! test
-<nowiki> unordered list
-!! input
-<nowiki>* This is not an unordered list item.</nowiki>
-!! result
-<p>* This is not an unordered list item.
-</p>
-!! end
-
-!! test
-<nowiki> spacing
-!! input
-<nowiki>Lorem ipsum dolor
-
-sed abit.
- sed nullum.
-
-:and a colon
-</nowiki>
-!! result
-<p>Lorem ipsum dolor
-
-sed abit.
- sed nullum.
-
-:and a colon
-
-</p>
-!! end
-
-!! test
-nowiki 3
-!! input
-:There is not nowiki.
-:There is <nowiki>nowiki</nowiki>.
-
-#There is not nowiki.
-#There is <nowiki>nowiki</nowiki>.
-
-*There is not nowiki.
-*There is <nowiki>nowiki</nowiki>.
-!! result
-<dl><dd>There is not nowiki.
-</dd><dd>There is nowiki.
-</dd></dl>
-<ol><li>There is not nowiki.
-</li><li>There is nowiki.
-</li></ol>
-<ul><li>There is not nowiki.
-</li><li>There is nowiki.
-</li></ul>
-
-!! end
-
-
-###
-### Comments
-###
-!! test
-Comment test 1
-!! input
-<!-- comment 1 --> asdf
-<!-- comment 2 -->
-!! result
-<pre>asdf
-</pre>
-
-!! end
-
-!! test
-Comment test 2
-!! input
-asdf
-<!-- comment 1 -->
-jkl
-!! result
-<p>asdf
-jkl
-</p>
-!! end
-
-!! test
-Comment test 3
-!! input
-asdf
-<!-- comment 1 -->
-<!-- comment 2 -->
-jkl
-!! result
-<p>asdf
-jkl
-</p>
-!! end
-
-!! test
-Comment test 4
-!! input
-asdf<!-- comment 1 -->jkl
-!! result
-<p>asdfjkl
-</p>
-!! end
-
-!! test
-Comment spacing
-!! input
-a
- <!-- foo --> b <!-- bar -->
-c
-!! result
-<p>a
-</p>
-<pre> b
-</pre>
-<p>c
-</p>
-!! end
-
-!! test
-Comment whitespace
-!! input
-<!-- returns a single newline, not nothing, since the newline after > is not stripped -->
-!! result
-
-!! end
-
-!! test
-Comment semantics and delimiters
-!! input
-<!-- --><!----><!-----><!------>
-!! result
-
-!! end
-
-!! test
-Comment semantics and delimiters, redux
-!! input
-<!-- In SGML every "foo" here would actually show up in the text -- foo -- bar
--- foo -- funky huh? ... -->
-!! result
-
-!! end
-
-!! test
-Comment semantics and delimiters: directors cut
-!! input
-<!-- ... However we like to keep things simple and somewhat XML-ish so we eat
-everything starting with < followed by !-- until the first -- and > we see,
-that wouldn't be valid XML however, since in XML -- has to terminate a comment
--->-->
-!! result
-<p>--&gt;
-</p>
-!! end
-
-!! test
-Comment semantics: nesting
-!! input
-<!--<!-- no, we're not going to do anything fancy here -->-->
-!! result
-<p>--&gt;
-</p>
-!! end
-
-!! test
-Comment semantics: unclosed comment at end
-!! input
-<!--This comment will run out to the end of the document
-!! result
-
-!! end
-
-!! test
-Comment in template title
-!! input
-{{f<!---->oo}}
-!! result
-<p>FOO
-</p>
-!! end
-
-!! test
-Comment on its own line post-expand
-!! input
-a
-{{blank}}<!---->
-b
-!! result
-<p>a
-</p><p>b
-</p>
-!! end
-
-###
-### Preformatted text
-###
-!! test
-Preformatted text
-!! input
- This is some
- Preformatted text
- With ''italic''
- And '''bold'''
- And a [[Main Page|link]]
-!! result
-<pre>This is some
-Preformatted text
-With <i>italic</i>
-And <b>bold</b>
-And a <a href="/wiki/Main_Page" title="Main Page">link</a>
-</pre>
-!! end
-
-!! test
-<pre> with <nowiki> inside (compatibility with 1.6 and earlier)
-!! input
-<pre><nowiki>
-<b>
-<cite>
-<em>
-</nowiki></pre>
-!! result
-<pre>
-&lt;b&gt;
-&lt;cite&gt;
-&lt;em&gt;
-</pre>
-
-!! end
-
-!! test
-Regression with preformatted in <center>
-!! input
-<center>
- Blah
-</center>
-!! result
-<center>
-<pre>Blah
-</pre>
-</center>
-
-!! end
-
-# Expected output in the following test is not really expected (there should be
-# <pre> in the output) -- it's only testing for well-formedness.
-!! test
-Bug 6200: Preformatted in <blockquote>
-!! input
-<blockquote>
- Blah
-</blockquote>
-!! result
-<blockquote>
- Blah
-</blockquote>
-
-!! end
-
-!! test
-<pre> with attributes (bug 3202)
-!! input
-<pre style="background: blue; color:white">Bluescreen of WikiDeath</pre>
-!! result
-<pre style="background: blue; color:white">Bluescreen of WikiDeath</pre>
-
-!! end
-
-!! test
-<pre> with width attribute (bug 3202)
-!! input
-<pre width="8">Narrow screen goodies</pre>
-!! result
-<pre width="8">Narrow screen goodies</pre>
-
-!! end
-
-!! test
-<pre> with forbidden attribute (bug 3202)
-!! input
-<pre width="8" onmouseover="alert(document.cookie)">Narrow screen goodies</pre>
-!! result
-<pre width="8">Narrow screen goodies</pre>
-
-!! end
-
-!! test
-<pre> with forbidden attribute values (bug 3202)
-!! input
-<pre width="8" style="border-width: expression(alert(document.cookie))">Narrow screen goodies</pre>
-!! result
-<pre width="8" style="/* insecure input */">Narrow screen goodies</pre>
-
-!! end
-
-!! test
-<nowiki> inside <pre> (bug 13238)
-!! input
-<pre>
-<nowiki>
-</pre>
-<pre>
-<nowiki></nowiki>
-</pre>
-<pre><nowiki><nowiki></nowiki>Foo<nowiki></nowiki></nowiki></pre>
-!! result
-<pre>
-&lt;nowiki&gt;
-</pre>
-<pre>
-
-</pre>
-<pre>&lt;nowiki&gt;Foo&lt;/nowiki&gt;</pre>
-
-!! end
-
-!! test
-<nowiki> and <pre> preference (first one wins)
-!! input
-<pre>
-<nowiki>
-</pre>
-</nowiki>
-</pre>
-
-<nowiki>
-<pre>
-<nowiki>
-</pre>
-</nowiki>
-</pre>
-
-!! result
-<pre>
-&lt;nowiki&gt;
-</pre>
-<p>&lt;/nowiki&gt;
-&lt;/pre&gt;
-</p><p>
-&lt;pre&gt;
-&lt;nowiki&gt;
-&lt;/pre&gt;
-
-&lt;/pre&gt;
-</p>
-!! end
-
-
-###
-### Definition lists
-###
-!! test
-Simple definition
-!! input
-; name : Definition
-!! result
-<dl><dt> name&#160;</dt><dd> Definition
-</dd></dl>
-
-!! end
-
-!! test
-Definition list for indentation only
-!! input
-: Indented text
-!! result
-<dl><dd> Indented text
-</dd></dl>
-
-!! end
-
-!! test
-Definition list with no space
-!! input
-;name:Definition
-!! result
-<dl><dt>name</dt><dd>Definition
-</dd></dl>
-
-!!end
-
-!! test
-Definition list with URL link
-!! input
-; http://example.com/ : definition
-!! result
-<dl><dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt><dd> definition
-</dd></dl>
-
-!! end
-
-!! test
-Definition list with bracketed URL link
-!! input
-;[http://www.example.com/ Example]:Something about it
-!! result
-<dl><dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt><dd>Something about it
-</dd></dl>
-
-!! end
-
-!! test
-Definition list with wikilink containing colon
-!! input
-; [[Help:FAQ]]: The least-read page on Wikipedia
-!! result
-<dl><dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt><dd> The least-read page on Wikipedia
-</dd></dl>
-
-!! end
-
-# At Brion's and JeLuF's insistence... :)
-!! test
-Definition list with news link containing colon
-!! input
-; news:alt.wikipedia.rox: This isn't even a real newsgroup!
-!! result
-<dl><dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt><dd> This isn't even a real newsgroup!
-</dd></dl>
-
-!! end
-
-!! test
-Malformed definition list with colon
-!! input
-; news:alt.wikipedia.rox -- don't crash or enter an infinite loop
-!! result
-<dl><dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
-</dt></dl>
-
-!! end
-
-!! test
-Definition lists: colon in external link text
-!! input
-; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
-!! result
-<dl><dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt><dd> OK, I made that up
-</dd></dl>
-
-!! end
-
-!! test
-Definition lists: colon in HTML attribute
-!! input
-;<b style="display: inline">bold</b>
-!! result
-<dl><dt><b style="display: inline">bold</b>
-</dt></dl>
-
-!! end
-
-
-!! test
-Definition lists: self-closed tag
-!! input
-;one<br/>two : two-line fun
-!! result
-<dl><dt>one<br />two&#160;</dt><dd> two-line fun
-</dd></dl>
-
-!! end
-
-!! test
-Bug 11748: Literal closing tags
-!! options
-disabled
-!! input
-<dl>
-<dt>test 1</dt>
-<dd>test test test test test</dd>
-<dt>test 2</dt>
-<dd>test test test test test</dd>
-</dl>
-!! result
-<dl>
-<dt>test 1</dt>
-<dd>test test test test test</dd>
-<dt>test 2</dt>
-<dd>test test test test test</dd>
-</dl>
-!! end
-
-!! test
-Definition and unordered list using wiki syntax nested in unordered list using html tags.
-!! input
-<ul><li>
-; term : description
-* unordered
-</li>
-</ul>
-!! result
-<ul><li>
-<dl><dt> term&#160;</dt><dd> description
-</dd></dl>
-<ul><li> unordered
-</li></ul>
-</li>
-</ul>
-
-!! end
-
-!! test
-Definition list with empty definition and following paragraph
-!! input
-; term:
-Paragraph text
-!! result
-<dl><dt> term</dt><dd>
-</dd></dl>
-<p>Paragraph text
-</p>
-!! end
-
-!! test
-Definition Lists: No nesting: Multiple dd's
-!! input
-;x
-:a
-:b
-!! result
-<dl><dt>x
-</dt><dd>a
-</dd><dd>b
-</dd></dl>
-
-!! end
-
-!! test
-Definition Lists: Indentation: Regular
-!! input
-:i1
-::i2
-:::i3
-!! result
-<dl><dd>i1
-<dl><dd>i2
-<dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-
-!! end
-
-!! test
-Definition Lists: Indentation: Missing 1st level
-!! input
-::i2
-:::i3
-!! result
-<dl><dd><dl><dd>i2
-<dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-
-!! end
-
-!! test
-Definition Lists: Indentation: Multi-level indent
-!! input
-:::i3
-!! result
-<dl><dd><dl><dd><dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-
-!! end
-
-## The PHP parser treats : items (dd) without a corresponding ; item (dt)
-## as an empty dt item. It also ignores all but the last ";" when followed
-## by ":" later on. So, ";" are not ignored in ";;;t3" but are ignored in
-## ";;;t3 :d1". So, PHP parser behavior is a little inconsistent wrt multiple
-## ";"s.
-##
-## Ex: ";;t2 ::d2" is transformed into:
-##
-## <dl>
-## <dt>t2 </dt>
-## <dd>
-## <dl>
-## <dt></dt>
-## <dd>d2</dd>
-## </dl>
-## </dd>
-## </dl>
-##
-## But, Parsoid treats "; :" as a tight atomic unit and excess ":" as plain text
-## So, the same wikitext above (;;t2 ::d2) is transformed into:
-##
-## <dl>
-## <dt>
-## <dl>
-## <dt>t2 </dt>
-## <dd>:d2</dd>
-## </dl>
-## </dt>
-## </dl>
-##
-## All Parsoid only definition list tests have this difference.
-##
-## See also: https://bugzilla.wikimedia.org/show_bug.cgi?id=6569
-## and http://lists.wikimedia.org/pipermail/wikitext-l/2011-November/000483.html
-
-!! test
-Definition Lists: Nesting: Multi-level (Parsoid only)
-!! options
-disabled
-!! input
-;t1 :d1
-;;t2 ::d2
-;;;t3 :::d3
-!! result
-<dl>
- <dt>t1 </dt>
- <dd>d1</dd>
- <dt>
- <dl>
- <dt>t2 </dt>
- <dd>:d2</dd>
- <dt>
- <dl>
- <dt>t3 </dt>
- <dd>::d3</dd>
- </dl>
- </dt>
- </dl>
- </dt>
-</dl>
-
-
-!! end
-
-
-!! test
-Definition Lists: Nesting: Test 2 (Parsoid only)
-!! options
-disabled
-!! input
-;t1
-::d2
-!! result
-<dl>
- <dt>t1</dt>
- <dd>
- <dl>
- <dd>d2</dd>
- </dl>
- </dd>
-</dl>
-
-!! end
-
-
-!! test
-Definition Lists: Nesting: Test 3 (Parsoid only)
-!! options
-disabled
-!! input
-:;t1
-::::d2
-!! result
-<dl>
- <dd>
- <dl>
- <dt>t1</dt>
- <dd>
- <dl>
- <dd>
- <dl>
- <dd>d2</dd>
- </dl>
- </dd>
- </dl>
- </dd>
- </dl>
- </dd>
-</dl>
-
-!! end
-
-
-!! test
-Definition Lists: Nesting: Test 4
-!! input
-::;t3
-:::d3
-!! result
-<dl><dd><dl><dd><dl><dt>t3
-</dt><dd>d3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 1
-!! input
-:;* foo
-::* bar
-:; baz
-!! result
-<dl><dd><dl><dt><ul><li> foo
-</li><li> bar
-</li></ul>
-</dt></dl>
-<dl><dt> baz
-</dt></dl>
-</dd></dl>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 2
-!! input
-*: d1
-*: d2
-!! result
-<ul><li><dl><dd> d1
-</dd><dd> d2
-</dd></dl>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 3
-!! input
-*::: d1
-*::: d2
-!! result
-<ul><li><dl><dd><dl><dd><dl><dd> d1
-</dd><dd> d2
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 4
-!! input
-*;d1 :d2
-*;d3 :d4
-!! result
-<ul><li><dl><dt>d1&#160;</dt><dd>d2
-</dd><dt>d3&#160;</dt><dd>d4
-</dd></dl>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 5
-!! input
-*:d1
-*:: d2
-!! result
-<ul><li><dl><dd>d1
-<dl><dd> d2
-</dd></dl>
-</dd></dl>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 6
-!! input
-#*:d1
-#*::: d3
-!! result
-<ol><li><ul><li><dl><dd>d1
-<dl><dd><dl><dd> d3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
-</li></ol>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 7
-!! input
-:* d1
-:* d2
-!! result
-<dl><dd><ul><li> d1
-</li><li> d2
-</li></ul>
-</dd></dl>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 8
-!! input
-:* d1
-::* d2
-!! result
-<dl><dd><ul><li> d1
-</li></ul>
-<dl><dd><ul><li> d2
-</li></ul>
-</dd></dl>
-</dd></dl>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 9
-!! input
-*;foo :bar
-!! result
-<ul><li><dl><dt>foo&#160;</dt><dd>bar
-</dd></dl>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 10
-!! input
-*#;foo :bar
-!! result
-<ul><li><ol><li><dl><dt>foo&#160;</dt><dd>bar
-</dd></dl>
-</li></ol>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 11
-!! input
-*#*#;*;;foo :bar
-*#*#;boo :baz
-!! result
-<ul><li><ol><li><ul><li><ol><li><dl><dt>foo&#160;</dt><dd><ul><li><dl><dt><dl><dt>bar
-</dt></dl>
-</dd></dl>
-</li></ul>
-</dd></dl>
-<dl><dt>boo&#160;</dt><dd>baz
-</dd></dl>
-</li></ol>
-</li></ul>
-</li></ol>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Weird Ones: Test 1
-!! input
-*#;*::;; foo : bar (who uses this?)
-!! result
-<ul><li><ol><li><dl><dt> foo&#160;</dt><dd><ul><li><dl><dd><dl><dd><dl><dt><dl><dt> bar (who uses this?)
-</dt></dl>
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
-</dd></dl>
-</li></ol>
-</li></ul>
-
-!! end
-
-###
-### External links
-###
-!! test
-External links: non-bracketed
-!! input
-Non-bracketed: http://example.com
-!! result
-<p>Non-bracketed: <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
-</p>
-!! end
-
-!! test
-External links: numbered
-!! input
-Numbered: [http://example.com]
-Numbered: [http://example.net]
-Numbered: [http://example.com]
-!! result
-<p>Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[1]</a>
-Numbered: <a rel="nofollow" class="external autonumber" href="http://example.net">[2]</a>
-Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[3]</a>
-</p>
-!!end
-
-!! test
-External links: specified text
-!! input
-Specified text: [http://example.com link]
-!! result
-<p>Specified text: <a rel="nofollow" class="external text" href="http://example.com">link</a>
-</p>
-!!end
-
-!! test
-External links: trail
-!! input
-Linktrails should not work for external links: [http://example.com link]s
-!! result
-<p>Linktrails should not work for external links: <a rel="nofollow" class="external text" href="http://example.com">link</a>s
-</p>
-!! end
-
-!! test
-External links: dollar sign in URL
-!! input
-http://example.com/1$2345
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com/1$2345">http://example.com/1$2345</a>
-</p>
-!! end
-
-!! test
-External links: dollar sign in URL (named)
-!! input
-[http://example.com/1$2345]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://example.com/1$2345">[1]</a>
-</p>
-!!end
-
-!! test
-External links: open square bracket forbidden in URL (bug 4377)
-!! input
-http://example.com/1[2345
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com/1">http://example.com/1</a>[2345
-</p>
-!! end
-
-!! test
-External links: open square bracket forbidden in URL (named) (bug 4377)
-!! input
-[http://example.com/1[2345]
-!! result
-<p><a rel="nofollow" class="external text" href="http://example.com/1">[2345</a>
-</p>
-!!end
-
-!! test
-External links: nowiki in URL link text (bug 6230)
-!!input
-[http://example.com/ <nowiki>''example site''</nowiki>]
-!! result
-<p><a rel="nofollow" class="external text" href="http://example.com/">''example site''</a>
-</p>
-!! end
-
-!! test
-External links: newline forbidden in text (bug 6230 regression check)
-!! input
-[http://example.com/ first
-second]
-!! result
-<p>[<a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a> first
-second]
-</p>
-!!end
-
-!! test
-External links: protocol-relative URL in brackets
-!! input
-[//example.com/ Test]
-!! result
-<p><a rel="nofollow" class="external text" href="//example.com/">Test</a>
-</p>
-!! end
-
-!! test
-External links: protocol-relative URL in brackets without text
-!! input
-[//example.com]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="//example.com">[1]</a>
-</p>
-!! end
-
-!! test
-External links: protocol-relative URL in free text is left alone
-!! input
-//example.com/Foo
-!! result
-<p>//example.com/Foo
-</p>
-!!end
-
-!! test
-External links: protocol-relative URL in the middle of a word is left alone (bug 30269)
-!! input
-foo//example.com/Foo
-!! result
-<p>foo//example.com/Foo
-</p>
-!! end
-
-!! test
-External image
-!! input
-External image: http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
-!! result
-<p>External image: <img src="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" />
-</p>
-!! end
-
-!! test
-External image from https
-!! input
-External image from https: https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
-!! result
-<p>External image from https: <img src="https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" />
-</p>
-!! end
-
-!! test
-Link to non-http image, no img tag
-!! input
-Link to non-http image, no img tag: ftp://example.com/test.jpg
-!! result
-<p>Link to non-http image, no img tag: <a rel="nofollow" class="external free" href="ftp://example.com/test.jpg">ftp://example.com/test.jpg</a>
-</p>
-!! end
-
-!! test
-External links: terminating separator
-!! input
-Terminating separator: http://example.com/thing,
-!! result
-<p>Terminating separator: <a rel="nofollow" class="external free" href="http://example.com/thing">http://example.com/thing</a>,
-</p>
-!! end
-
-!! test
-External links: intervening separator
-!! input
-Intervening separator: http://example.com/1,2,3
-!! result
-<p>Intervening separator: <a rel="nofollow" class="external free" href="http://example.com/1,2,3">http://example.com/1,2,3</a>
-</p>
-!! end
-
-!! test
-External links: old bug with URL in query
-!! input
-Old bug with URL in query: [http://example.com/thing?url=http://example.com link]
-!! result
-<p>Old bug with URL in query: <a rel="nofollow" class="external text" href="http://example.com/thing?url=http://example.com">link</a>
-</p>
-!! end
-
-!! test
-External links: old URL-in-URL bug, mixed protocols
-!! input
-And again with mixed protocols: [ftp://example.com?url=http://example.com link]
-!! result
-<p>And again with mixed protocols: <a rel="nofollow" class="external text" href="ftp://example.com?url=http://example.com">link</a>
-</p>
-!!end
-
-!! test
-External links: URL in text
-!! input
-URL in text: [http://example.com http://example.com]
-!! result
-<p>URL in text: <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
-</p>
-!! end
-
-!! test
-External links: Clickable images
-!! input
-ja-style clickable images: [http://example.com http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png]
-!! result
-<p>ja-style clickable images: <a rel="nofollow" class="external text" href="http://example.com"><img src="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" /></a>
-</p>
-!!end
-
-!! test
-External links: raw ampersand
-!! input
-Old &amp; use: http://x&y
-!! result
-<p>Old &amp; use: <a rel="nofollow" class="external free" href="http://x&amp;y">http://x&amp;y</a>
-</p>
-!! end
-
-!! test
-External links: encoded ampersand
-!! input
-Old &amp; use: http://x&amp;y
-!! result
-<p>Old &amp; use: <a rel="nofollow" class="external free" href="http://x&amp;y">http://x&amp;y</a>
-</p>
-!! end
-
-!! test
-External links: encoded equals (bug 6102)
-!! input
-http://example.com/?foo&#61;bar
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com/?foo=bar">http://example.com/?foo=bar</a>
-</p>
-!! end
-
-!! test
-External links: [raw ampersand]
-!! input
-Old &amp; use: [http://x&y]
-!! result
-<p>Old &amp; use: <a rel="nofollow" class="external autonumber" href="http://x&amp;y">[1]</a>
-</p>
-!! end
-
-!! test
-External links: [encoded ampersand]
-!! input
-Old &amp; use: [http://x&amp;y]
-!! result
-<p>Old &amp; use: <a rel="nofollow" class="external autonumber" href="http://x&amp;y">[1]</a>
-</p>
-!! end
-
-!! test
-External links: [encoded equals] (bug 6102)
-!! input
-[http://example.com/?foo&#61;bar]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://example.com/?foo=bar">[1]</a>
-</p>
-!! end
-
-!! test
-External links: [IDN ignored character reference in hostname; strip it right off]
-!! input
-[http://e&zwnj;xample.com/]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://example.com/">[1]</a>
-</p>
-!! end
-
-# FIXME: This test (the IDN characters in the text of a link) is an inconsistency.
-# Where an external link could easily circumvent the sanitization of the text of
-# a link like this (where an IDN-ignore character is in the URL somewhere), this
-# test demands a higher standard. That's a bit strange.
-#
-# Example:
-#
-# http://e‌xample.com -> [http://example.com|http://example.com]
-# [http://example.com|http://e‌xample.com] -> [http://example.com|http://e‌xample.com]
-#
-# The first example is sanitized, but the second is not. Any security benefits
-# from this production are trivial to circumvent. Either remove this test and
-# let the parser(s) do their thing unaccosted, or fix the inconsistency and change
-# the test accordingly.
-#
-# All our love,
-# The Parsoid team.
-!! test
-External links: IDN ignored character reference in hostname; strip it right off
-!! input
-http://e&zwnj;xample.com/
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>
-</p>
-!! end
-
-!! test
-External links: www.jpeg.org (bug 554)
-!! input
-http://www.jpeg.org
-!!result
-<p><a rel="nofollow" class="external free" href="http://www.jpeg.org">http://www.jpeg.org</a>
-</p>
-!! end
-
-!! test
-External links: URL within URL (original bug 2)
-!! input
-[http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp">[1]</a>
-</p>
-!! end
-
-!! test
-BUG 361: URL inside bracketed URL
-!! input
-[http://www.example.com/foo http://www.example.com/bar]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/foo">http://www.example.com/bar</a>
-</p>
-!! end
-
-!! test
-BUG 361: URL within URL, not bracketed
-!! input
-http://www.example.com/foo?=http://www.example.com/bar
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.com/foo?=http://www.example.com/bar">http://www.example.com/foo?=http://www.example.com/bar</a>
-</p>
-!! end
-
-!! test
-BUG 289: ">"-token in URL-tail
-!! input
-http://www.example.com/<hello>
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a>&lt;hello&gt;
-</p>
-!!end
-
-!! test
-BUG 289: literal ">"-token in URL-tail
-!! input
-http://www.example.com/<b>html</b>
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a><b>html</b>
-</p>
-!!end
-
-!! test
-BUG 289: ">"-token in bracketed URL
-!! input
-[http://www.example.com/<hello> stuff]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/">&lt;hello&gt; stuff</a>
-</p>
-!!end
-
-!! test
-BUG 289: literal ">"-token in bracketed URL
-!! input
-[http://www.example.com/<b>html</b> stuff]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/"><b>html</b> stuff</a>
-</p>
-!!end
-
-!! test
-BUG 289: literal double quote at end of URL
-!! input
-http://www.example.com/"hello"
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a>"hello"
-</p>
-!!end
-
-!! test
-BUG 289: literal double quote in bracketed URL
-!! input
-[http://www.example.com/"hello" stuff]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/">"hello" stuff</a>
-</p>
-!!end
-
-!! test
-External links: multiple legal whitespace is fine, Magnus. Don't break it please. (bug 5081)
-!! input
-[http://www.example.com test]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com">test</a>
-</p>
-!! end
-
-!! test
-External links: wiki links within external link (Bug 3695)
-!! input
-[http://example.com [[wikilink]] embedded in ext link]
-!! result
-<p><a rel="nofollow" class="external text" href="http://example.com"></a><a href="/index.php?title=Wikilink&amp;action=edit&amp;redlink=1" class="new" title="Wikilink (page does not exist)">wikilink</a><a rel="nofollow" class="external text" href="http://example.com"> embedded in ext link</a>
-</p>
-!! end
-
-!! test
-BUG 787: Links with one slash after the url protocol are invalid
-!! input
-http:/example.com
-
-[http:/example.com title]
-!! result
-<p>http:/example.com
-</p><p>[http:/example.com title]
-</p>
-!! end
-
-!! test
-Bug 2702: Mismatched <i>, <b> and <a> tags are invalid
-!! input
-''[http://example.com text'']
-[http://example.com '''text]'''
-''Something [http://example.com in italic'']
-''Something [http://example.com mixed''''', even bold]'''
-'''''Now [http://example.com both''''']
-!! result
-<p><a rel="nofollow" class="external text" href="http://example.com"><i>text</i></a>
-<a rel="nofollow" class="external text" href="http://example.com"><b>text</b></a>
-<i>Something </i><a rel="nofollow" class="external text" href="http://example.com"><i>in italic</i></a>
-<i>Something </i><a rel="nofollow" class="external text" href="http://example.com"><i>mixed</i><b>, even bold</b></a>
-<i><b>Now </b></i><a rel="nofollow" class="external text" href="http://example.com"><i><b>both</b></i></a>
-</p>
-!! end
-
-
-!! test
-Bug 4781: %26 in URL
-!! input
-http://www.example.com/?title=AT%26T
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.com/?title=AT%26T">http://www.example.com/?title=AT%26T</a>
-</p>
-!! end
-
-# According to http://dev.w3.org/html5/spec/Overview.html#parsing-urls a plain
-# % is actually legal in HTML5. Any change in output would need testing though.
-!! test
-Bug 4781, 5267: %25 in URL
-!! input
-http://www.example.com/?title=100%25_Bran
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.com/?title=100%25_Bran">http://www.example.com/?title=100%25_Bran</a>
-</p>
-!! end
-
-!! test
-Bug 4781, 5267: %28, %29 in URL
-!! input
-http://www.example.com/?title=Ben-Hur_%281959_film%29
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">http://www.example.com/?title=Ben-Hur_%281959_film%29</a>
-</p>
-!! end
-
-
-!! test
-Bug 4781: %26 in autonumber URL
-!! input
-[http://www.example.com/?title=AT%26T]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=AT%26T">[1]</a>
-</p>
-!! end
-
-!! test
-Bug 4781, 5267: %26 in autonumber URL
-!! input
-[http://www.example.com/?title=100%25_Bran]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=100%25_Bran">[1]</a>
-</p>
-!! end
-
-!! test
-Bug 4781, 5267: %28, %29 in autonumber URL
-!! input
-[http://www.example.com/?title=Ben-Hur_%281959_film%29]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">[1]</a>
-</p>
-!! end
-
-
-!! test
-Bug 4781: %26 in bracketed URL
-!! input
-[http://www.example.com/?title=AT%26T link]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/?title=AT%26T">link</a>
-</p>
-!! end
-
-!! test
-Bug 4781, 5267: %26 in bracketed URL
-!! input
-[http://www.example.com/?title=100%25_Bran link]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/?title=100%25_Bran">link</a>
-</p>
-!! end
-
-!! test
-Bug 4781, 5267: %28, %29 in bracketed URL
-!! input
-[http://www.example.com/?title=Ben-Hur_%281959_film%29 link]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">link</a>
-</p>
-!! end
-
-!! test
-External link containing double-single-quotes in text '' (bug 4598 sanity check)
-!! input
-Some [http://example.com/ pretty ''italics'' and stuff]!
-!! result
-<p>Some <a rel="nofollow" class="external text" href="http://example.com/">pretty <i>italics</i> and stuff</a>!
-</p>
-!! end
-
-!! test
-External link containing double-single-quotes in text embedded in italics (bug 4598 sanity check)
-!! input
-''Some [http://example.com/ pretty ''italics'' and stuff]!''
-!! result
-<p><i>Some </i><a rel="nofollow" class="external text" href="http://example.com/"><i>pretty </i>italics<i> and stuff</i></a><i>!</i>
-</p>
-!! end
-
-!! test
-External link containing double-single-quotes with no space separating the url from text in italics
-!! input
-[http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm''La muerte de Casagemas'' (1901) en el sitio de [[Museo Picasso (París)|Museo Picasso]].]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm"><i>La muerte de Casagemas</i> (1901) en el sitio de <a href="/index.php?title=Museo_Picasso_(Par%C3%ADs)&amp;action=edit&amp;redlink=1" class="new" title="Museo Picasso (París) (page does not exist)">Museo Picasso</a>.</a>
-</p>
-!! end
-
-!! test
-URL-encoding in URL functions (single parameter)
-!! input
-{{localurl:Some page|amp=&}}
-!! result
-<p>/index.php?title=Some_page&amp;amp=&amp;
-</p>
-!! end
-
-!! test
-URL-encoding in URL functions (multiple parameters)
-!! input
-{{localurl:Some page|q=?&amp=&}}
-!! result
-<p>/index.php?title=Some_page&amp;q=?&amp;amp=&amp;
-</p>
-!! end
-
-!! test
-Brackets in urls
-!! input
-http://example.com/index.php?foozoid%5B%5D=bar
-
-http://example.com/index.php?foozoid&#x5B;&#x5D;=bar
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a>
-</p><p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a>
-</p>
-!! end
-
-!! test
-IPv6 urls (bug 21261)
-!! options
-disabled
-!! input
-http://[2404:130:0:1000::187:2]/index.php
-!! result
-<p><a rel="nofollow" class="external free" href="http://[2404:130:0:1000::187:2]/index.php">http://[2404:130:0:1000::187:2]/index.php</a>
-</p>
-!! end
-
-###
-### Quotes
-###
-
-!! test
-Quotes
-!! input
-Normal text. '''Bold text.''' Normal text. ''Italic text.''
-
-Normal text. '''''Bold italic text.''''' Normal text.
-!!result
-<p>Normal text. <b>Bold text.</b> Normal text. <i>Italic text.</i>
-</p><p>Normal text. <i><b>Bold italic text.</b></i> Normal text.
-</p>
-!! end
-
-
-!! test
-Unclosed and unmatched quotes
-!! input
-'''''Bold italic text '''with bold deactivated''' in between.'''''
-
-'''''Bold italic text ''with italic deactivated'' in between.'''''
-
-'''Bold text..
-
-..spanning two paragraphs (should not work).'''
-
-'''Bold tag left open
-
-''Italic tag left open
-
-Normal text.
-
-<!-- Unmatching number of opening, closing tags: -->
-'''This year''''s election ''should'' beat '''last year''''s.
-
-''Tom'''s car is bigger than ''Susan'''s.
-
-Plain ''italic'''s plain
-!! result
-<p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
-</p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b>
-</p><p><b>Bold text..</b>
-</p><p>..spanning two paragraphs (should not work).
-</p><p><b>Bold tag left open</b>
-</p><p><i>Italic tag left open</i>
-</p><p>Normal text.
-</p><p><b>This year'</b>s election <i>should</i> beat <b>last year'</b>s.
-</p><p><i>Tom<b>s car is bigger than </b></i><b>Susan</b>s.
-</p><p>Plain <i>italic'</i>s plain
-</p>
-!! end
-
-###
-### Tables
-###
-### some content taken from http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide:_Using_tables
-###
-
-# This should not produce <table></table> as <table><tr><td></td></tr></table>
-# is the bare minimun required by the spec, see:
-# http://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_module_Basic_Tables
-!! test
-A table with no data.
-!! input
-{||}
-!! result
-!! end
-
-# A table with nothing but a caption is invalid XHTML, we might want to render
-# this as <p>caption</p>
-!! test
-A table with nothing but a caption
-!! input
-{|
-|+ caption
-|}
-!! result
-<table>
-<caption> caption
-</caption><tr><td></td></tr></table>
-
-!! end
-
-!! test
-Simple table
-!! input
-{|
-| 1 || 2
-|-
-| 3 || 4
-|}
-!! result
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
-
-!! end
-
-!! test
-Multiplication table
-!! input
-{| border="1" cellpadding="2"
-|+Multiplication table
-|-
-! &times; !! 1 !! 2 !! 3
-|-
-! 1
-| 1 || 2 || 3
-|-
-! 2
-| 2 || 4 || 6
-|-
-! 3
-| 3 || 6 || 9
-|-
-! 4
-| 4 || 8 || 12
-|-
-! 5
-| 5 || 10 || 15
-|}
-!! result
-<table border="1" cellpadding="2">
-<caption>Multiplication table
-</caption>
-<tr>
-<th> &#215; </th>
-<th> 1 </th>
-<th> 2 </th>
-<th> 3
-</th></tr>
-<tr>
-<th> 1
-</th>
-<td> 1 </td>
-<td> 2 </td>
-<td> 3
-</td></tr>
-<tr>
-<th> 2
-</th>
-<td> 2 </td>
-<td> 4 </td>
-<td> 6
-</td></tr>
-<tr>
-<th> 3
-</th>
-<td> 3 </td>
-<td> 6 </td>
-<td> 9
-</td></tr>
-<tr>
-<th> 4
-</th>
-<td> 4 </td>
-<td> 8 </td>
-<td> 12
-</td></tr>
-<tr>
-<th> 5
-</th>
-<td> 5 </td>
-<td> 10 </td>
-<td> 15
-</td></tr></table>
-
-!! end
-
-!! test
-Table rowspan
-!! input
-{| border=1
-| Cell 1, row 1
-|rowspan=2| Cell 2, row 1 (and 2)
-| Cell 3, row 1
-|-
-| Cell 1, row 2
-| Cell 3, row 2
-|}
-!! result
-<table border="1">
-<tr>
-<td> Cell 1, row 1
-</td>
-<td rowspan="2"> Cell 2, row 1 (and 2)
-</td>
-<td> Cell 3, row 1
-</td></tr>
-<tr>
-<td> Cell 1, row 2
-</td>
-<td> Cell 3, row 2
-</td></tr></table>
-
-!! end
-
-!! test
-Nested table
-!! input
-{| border=1
-| &alpha;
-|
-{| bgcolor=#ABCDEF border=2
-|nested
-|-
-|table
-|}
-|the original table again
-|}
-!! result
-<table border="1">
-<tr>
-<td> &#945;
-</td>
-<td>
-<table bgcolor="#ABCDEF" border="2">
-<tr>
-<td>nested
-</td></tr>
-<tr>
-<td>table
-</td></tr></table>
-</td>
-<td>the original table again
-</td></tr></table>
-
-!! end
-
-!! test
-Invalid attributes in table cell (bug 1830)
-!! input
-{|
-|Cell:|broken
-|}
-!! result
-<table>
-<tr>
-<td>broken
-</td></tr></table>
-
-!! end
-
-
-!! test
-Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitech-l/2006-April/022293.html)
-!! input
-{|
-| |[ftp://|x||]" onmouseover="alert(document.cookie)">test
-!! result
-<table>
-<tr>
-<td>[<a rel="nofollow" class="external free" href="ftp://%7Cx">ftp://%7Cx</a></td>
-<td>]" onmouseover="alert(document.cookie)"&gt;test
-</td>
-</tr>
-</table>
-
-!! end
-
-
-!! test
-Indented table markup mixed with indented pre content (proposed in bug 6200)
-!! input
- <table>
- <tr>
- <td>
- Text that should be rendered preformatted
- </td>
- </tr>
- </table>
-!! result
- <table>
- <tr>
- <td>
-<pre>Text that should be rendered preformatted
-</pre>
- </td>
- </tr>
- </table>
-
-!! end
-
-
-###
-### Internal links
-###
-!! test
-Plain link, capitalized
-!! input
-[[Main Page]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
-!! end
-
-!! test
-Plain link, uncapitalized
-!! input
-[[main Page]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">main Page</a>
-</p>
-!! end
-
-!! test
-Piped link
-!! input
-[[Main Page|The Main Page]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">The Main Page</a>
-</p>
-!! end
-
-!! test
-Broken link
-!! input
-[[Zigzagzogzagzig]]
-!! result
-<p><a href="/index.php?title=Zigzagzogzagzig&amp;action=edit&amp;redlink=1" class="new" title="Zigzagzogzagzig (page does not exist)">Zigzagzogzagzig</a>
-</p>
-!! end
-
-!! test
-Broken link with fragment
-!! input
-[[Zigzagzogzagzig#zug]]
-!! result
-<p><a href="/index.php?title=Zigzagzogzagzig&amp;action=edit&amp;redlink=1" class="new" title="Zigzagzogzagzig (page does not exist)">Zigzagzogzagzig#zug</a>
-</p>
-!! end
-
-!! test
-Special page link with fragment
-!! input
-[[Special:Version#anchor]]
-!! result
-<p><a href="/wiki/Special:Version#anchor" title="Special:Version">Special:Version#anchor</a>
-</p>
-!! end
-
-!! test
-Nonexistent special page link with fragment
-!! input
-[[Special:ThisNameWillHopefullyNeverBeUsed#anchor]]
-!! result
-<p><a href="/wiki/Special:ThisNameWillHopefullyNeverBeUsed" class="new" title="Special:ThisNameWillHopefullyNeverBeUsed (page does not exist)">Special:ThisNameWillHopefullyNeverBeUsed#anchor</a>
-</p>
-!! end
-
-!! test
-Link with prefix
-!! input
-xxx[[main Page]], xxx[[Main Page]], Xxx[[main Page]] XXX[[main Page]], XXX[[Main Page]]
-!! result
-<p>xxx<a href="/wiki/Main_Page" title="Main Page">main Page</a>, xxx<a href="/wiki/Main_Page" title="Main Page">Main Page</a>, Xxx<a href="/wiki/Main_Page" title="Main Page">main Page</a> XXX<a href="/wiki/Main_Page" title="Main Page">main Page</a>, XXX<a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
-!! end
-
-!! test
-Link with suffix
-!! input
-[[Main Page]]xxx, [[Main Page]]XXX, [[Main Page]]!!!
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Pagexxx</a>, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>XXX, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>!!!
-</p>
-!! end
-
-!! test
-Link with 3 brackets
-!! input
-[[[main page]]]
-!! result
-<p>[[[main page]]]
-</p>
-!! end
-
-!! test
-Piped link with 3 brackets
-!! input
-[[[main page|the main page]]]
-!! result
-<p>[[[main page|the main page]]]
-</p>
-!! end
-
-!! test
-Link with multiple pipes
-!! input
-[[Main Page|The|Main|Page]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">The|Main|Page</a>
-</p>
-!! end
-
-!! test
-Link to namespaces
-!! input
-[[Talk:Parser testing]], [[Meta:Disclaimers]]
-!! result
-<p><a href="/index.php?title=Talk:Parser_testing&amp;action=edit&amp;redlink=1" class="new" title="Talk:Parser testing (page does not exist)">Talk:Parser testing</a>, <a href="/index.php?title=Meta:Disclaimers&amp;action=edit&amp;redlink=1" class="new" title="Meta:Disclaimers (page does not exist)">Meta:Disclaimers</a>
-</p>
-!! end
-
-!! test
-Piped link to namespace
-!! input
-[[Meta:Disclaimers|The disclaimers]]
-!! result
-<p><a href="/index.php?title=Meta:Disclaimers&amp;action=edit&amp;redlink=1" class="new" title="Meta:Disclaimers (page does not exist)">The disclaimers</a>
-</p>
-!! end
-
-!! test
-Link containing }
-!! input
-[[Usually caused by a typo (oops}]]
-!! result
-<p>[[Usually caused by a typo (oops}]]
-</p>
-!! end
-
-!! test
-Link containing % (not as a hex sequence)
-!! input
-[[7% Solution]]
-!! result
-<p><a href="/index.php?title=7%25_Solution&amp;action=edit&amp;redlink=1" class="new" title="7% Solution (page does not exist)">7% Solution</a>
-</p>
-!! end
-
-!! test
-Link containing % as a single hex sequence interpreted to char
-!! input
-[[7%25 Solution]]
-!! result
-<p><a href="/index.php?title=7%25_Solution&amp;action=edit&amp;redlink=1" class="new" title="7% Solution (page does not exist)">7% Solution</a>
-</p>
-!!end
-
-!! test
-Link containing % as a double hex sequence interpreted to hex sequence
-!! input
-[[7%2525 Solution]]
-!! result
-<p>[[7%2525 Solution]]
-</p>
-!!end
-
-!! test
-Link containing "#<" and "#>" % as a hex sequences- these are valid section anchors
-Example for such a section: == < ==
-!! input
-[[%23%3c]][[%23%3e]]
-!! result
-<p><a href="#.3C">#&lt;</a><a href="#.3E">#&gt;</a>
-</p>
-!! end
-
-!! test
-Link containing "<#" and ">#" as a hex sequences
-!! input
-[[%3c%23]][[%3e%23]]
-!! result
-<p>[[%3c%23]][[%3e%23]]
-</p>
-!! end
-
-!! test
-Link containing double-single-quotes '' (bug 4598)
-!! input
-[[Lista d''e paise d''o munno]]
-!! result
-<p><a href="/index.php?title=Lista_d%27%27e_paise_d%27%27o_munno&amp;action=edit&amp;redlink=1" class="new" title="Lista d''e paise d''o munno (page does not exist)">Lista d''e paise d''o munno</a>
-</p>
-!! end
-
-!! test
-Link containing double-single-quotes '' in text (bug 4598 sanity check)
-!! input
-Some [[Link|pretty ''italics'' and stuff]]!
-!! result
-<p>Some <a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!
-</p>
-!! end
-
-!! test
-Link containing double-single-quotes '' in text embedded in italics (bug 4598 sanity check)
-!! input
-''Some [[Link|pretty ''italics'' and stuff]]!
-!! result
-<p><i>Some <a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!</i>
-</p>
-!! end
-
-!! test
-Link with double quotes in title part (literal) and alternate part (interpreted)
-!! input
-[[File:Denys Savchenko ''Pentecoste''.jpg]]
-
-[[''Pentecoste'']]
-
-[[''Pentecoste''|Pentecoste]]
-
-[[''Pentecoste''|''Pentecoste'']]
-!! result
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Denys_Savchenko_%27%27Pentecoste%27%27.jpg" class="new" title="File:Denys Savchenko &#39;&#39;Pentecoste&#39;&#39;.jpg">File:Denys Savchenko <i>Pentecoste</i>.jpg</a>
-</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">''Pentecoste''</a>
-</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">Pentecoste</a>
-</p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)"><i>Pentecoste</i></a>
-</p>
-!! end
-
-!! test
-Broken image links with HTML captions (bug 39700)
-!! input
-[[File:Nonexistent|<script></script>]]
-[[File:Nonexistent|100px|<script></script>]]
-[[File:Nonexistent|&lt;]]
-[[File:Nonexistent|a<i>b</i>c]]
-!! result
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">&lt;script&gt;&lt;/script&gt;</a>
-<a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">&lt;script&gt;&lt;/script&gt;</a>
-<a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">&lt;</a>
-<a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">abc</a>
-</p>
-!! end
-
-!! test
-Plain link to URL
-!! input
-[[http://www.example.com]]
-!! result
-<p>[<a rel="nofollow" class="external autonumber" href="http://www.example.com">[1]</a>]
-</p>
-!! end
-
-!! test
-Plain link to URL with link text
-!! input
-[[http://www.example.com Link text]]
-!! result
-<p>[<a rel="nofollow" class="external text" href="http://www.example.com">Link text</a>]
-</p>
-!! end
-
-!! test
-Plain link to protocol-relative URL
-!! input
-[[//www.example.com]]
-!! result
-<p>[<a rel="nofollow" class="external autonumber" href="//www.example.com">[1]</a>]
-</p>
-!! end
-
-!! test
-Plain link to protocol-relative URL with link text
-!! input
-[[//www.example.com Link text]]
-!! result
-<p>[<a rel="nofollow" class="external text" href="//www.example.com">Link text</a>]
-</p>
-!! end
-
-
-# I'm fairly sure the expected result here is wrong.
-# We want these to be URL links, not pseudo-pages with URLs for titles....
-# However the current output is also pretty screwy.
-#
-# ----
-# I'm changing it to match the current output--it arguably makes more
-# sense in the light of the test above. Old expected result was:
-#<p>Piped link to URL: <a href="/index.php?title=Http://www.example.com&amp;action=edit" class="new">an example URL</a>
-#</p>
-# But I think this test is bordering on "garbage in, garbage out" anyway.
-# -- wtm
-!! test
-Piped link to URL
-!! input
-Piped link to URL: [[http://www.example.com|an example URL]]
-!! result
-<p>Piped link to URL: [<a rel="nofollow" class="external text" href="http://www.example.com%7Can">example URL</a>]
-</p>
-!! end
-
-!! test
-BUG 2: [[page|http://url/]] should link to page, not http://url/
-!! input
-[[Main Page|http://url/]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">http://url/</a>
-</p>
-!! end
-
-!! test
-BUG 337: Escaped self-links should be bold
-!! options
-title=[[Bug462]]
-!! input
-[[Bu&#103;462]] [[Bug462]]
-!! result
-<p><strong class="selflink">Bu&#103;462</strong> <strong class="selflink">Bug462</strong>
-</p>
-!! end
-
-!! test
-Self-link to section should not be bold
-!! options
-title=[[Main Page]]
-!! input
-[[Main Page#section]]
-!! result
-<p><a href="/wiki/Main_Page#section" title="Main Page">Main Page#section</a>
-</p>
-!! end
-
-!! article
-00
-!! text
-This is 00.
-!! endarticle
-
-!!test
-Self-link to numeric title
-!!options
-title=[[0]]
-!!input
-[[0]]
-!!result
-<p><strong class="selflink">0</strong>
-</p>
-!!end
-
-!!test
-Link to numeric-equivalent title
-!!options
-title=[[0]]
-!!input
-[[00]]
-!!result
-<p><a href="/wiki/00" title="00">00</a>
-</p>
-!!end
-
-!! test
-<nowiki> inside a link
-!! input
-[[Main<nowiki> Page</nowiki>]] [[Main Page|the main page <nowiki>[it's not very good]</nowiki>]]
-!! result
-<p>[[Main Page]] <a href="/wiki/Main_Page" title="Main Page">the main page [it's not very good]</a>
-</p>
-!! end
-
-!! test
-Non-breaking spaces in title
-!! input
-[[&nbsp; Main &nbsp; Page &nbsp;]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">&#160; Main &#160; Page &#160;</a>
-</p>
-!!end
-
-!! test
-Internal link with ca linktrail, surrounded by bold apostrophes (bug 27473 primary issue)
-!! options
-language=ca
-!! input
-'''[[Main Page]]'''
-!! result
-<p><b><a href="/wiki/Main_Page" title="Main Page">Main Page</a></b>
-</p>
-!! end
-
-!! test
-Internal link with ca linktrail, surrounded by italic apostrophes (bug 27473 primary issue)
-!! options
-language=ca
-!! input
-''[[Main Page]]''
-!! result
-<p><i><a href="/wiki/Main_Page" title="Main Page">Main Page</a></i>
-</p>
-!! end
-
-!! test
-Internal link with en linktrail: no apostrophes (bug 27473)
-!! options
-language=en
-!! input
-[[Something]]'nice
-!! result
-<p><a href="/index.php?title=Something&amp;action=edit&amp;redlink=1" class="new" title="Something (page does not exist)">Something</a>'nice
-</p>
-!! end
-
-!! test
-Internal link with ca linktrail with apostrophes (bug 27473)
-!! options
-language=ca
-!! input
-[[Something]]'nice
-!! result
-<p><a href="/index.php?title=Something&amp;action=edit&amp;redlink=1" class="new" title="Something (encara no existeix)">Something'nice</a>
-</p>
-!! end
-
-!! test
-Internal link with kaa linktrail with apostrophes (bug 27473)
-!! options
-language=kaa
-!! input
-[[Something]]'nice
-!! result
-<p><a href="/index.php?title=Something&amp;action=edit&amp;redlink=1" class="new" title="Something (bet ele jaratılmag'an)">Something'nice</a>
-</p>
-!! end
-
-###
-### Interwiki links (see maintenance/interwiki.sql)
-###
-
-!! test
-Inline interwiki link
-!! input
-[[MeatBall:SoftSecurity]]
-!! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl?SoftSecurity" class="extiw" title="meatball:SoftSecurity">MeatBall:SoftSecurity</a>
-</p>
-!! end
-
-!! test
-Inline interwiki link with empty title (bug 2372)
-!! input
-[[MeatBall:]]
-!! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl" class="extiw" title="meatball:">MeatBall:</a>
-</p>
-!! end
-
-!! test
-Interwiki link encoding conversion (bug 1636)
-!! input
-*[[Wikipedia:ro:Olteni&#0355;a]]
-*[[Wikipedia:ro:Olteni&#355;a]]
-!! result
-<ul><li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
-</li><li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
-</li></ul>
-
-!! end
-
-!! test
-Interwiki link with fragment (bug 2130)
-!! input
-[[MeatBall:SoftSecurity#foo]]
-!! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl?SoftSecurity#foo" class="extiw" title="meatball:SoftSecurity">MeatBall:SoftSecurity#foo</a>
-</p>
-!! end
-
-!! test
-Interlanguage link
-!! input
-Blah blah blah
-[[zh:Chinese]]
-!!result
-<p>Blah blah blah
-</p>
-!! end
-
-!! test
-Double interlanguage link
-!! input
-Blah blah blah
-[[es:Spanish]]
-[[zh:Chinese]]
-!!result
-<p>Blah blah blah
-</p>
-!! end
-
-!! test
-Interlanguage link, with prefix links
-!! options
-language=ln
-!! input
-Blah blah blah
-[[zh:Chinese]]
-!!result
-<p>Blah blah blah
-</p>
-!! end
-
-!! test
-Double interlanguage link, with prefix links (bug 8897)
-!! options
-language=ln
-!! input
-Blah blah blah
-[[es:Spanish]]
-[[zh:Chinese]]
-!!result
-<p>Blah blah blah
-</p>
-!! end
-
-
-##
-## XHTML tidiness
-###
-
-!! test
-<br> to <br />
-!! input
-1<br>2<br />3
-!! result
-<p>1<br />2<br />3
-</p>
-!! end
-
-!! test
-Incorrecly removing closing slashes from correctly formed XHTML
-!! input
-<br style="clear:both;" />
-!! result
-<p><br style="clear:both;" />
-</p>
-!! end
-
-!! test
-Failing to transform badly formed HTML into correct XHTML
-!! input
-<br style="clear: left;">
-<br style="clear: right;">
-<br style="clear: both;">
-!! result
-<p><br style="clear: left;" />
-<br style="clear: right;" />
-<br style="clear: both;" />
-</p>
-!!end
-
-!! test
-Horizontal ruler (should it add that extra space?)
-!! input
-<hr>
-<hr >
-foo <hr
-> bar
-!! result
-<hr />
-<hr />
-foo <hr /> bar
-
-!! end
-
-!! test
-Horizontal ruler -- 4+ dashes render hr
-!! input
-----
-!! result
-<hr />
-
-!! end
-
-!! test
-Horizontal ruler -- eats additional dashes on the same line
-!! input
----------
-!! result
-<hr />
-
-!! end
-
-!! test
-Horizontal ruler -- does not collaps dashes on consecutive lines
-!! input
-----
-----
-!! result
-<hr />
-<hr />
-
-!! end
-
-!! test
-Horizontal ruler -- <4 dashes render as plain text
-!! input
----
-!! result
-<p>---
-</p>
-!! end
-
-###
-### Block-level elements
-###
-!! test
-Common list
-!! input
-*Common list
-* item 2
-*item 3
-!! result
-<ul><li>Common list
-</li><li> item 2
-</li><li>item 3
-</li></ul>
-
-!! end
-
-!! test
-Numbered list
-!! input
-#Numbered list
-#item 2
-# item 3
-!! result
-<ol><li>Numbered list
-</li><li>item 2
-</li><li> item 3
-</li></ol>
-
-!! end
-
-!! test
-Mixed list
-!! input
-*Mixed list
-*# with numbers
-** and bullets
-*# and numbers
-*bullets again
-**bullet level 2
-***bullet level 3
-***#Number on level 4
-**bullet level 2
-**#Number on level 3
-**#Number on level 3
-*#number level 2
-*Level 1
-*** Level 3
-#** Level 3, but ordered
-!! result
-<ul><li>Mixed list
-<ol><li> with numbers
-</li></ol>
-<ul><li> and bullets
-</li></ul>
-<ol><li> and numbers
-</li></ol>
-</li><li>bullets again
-<ul><li>bullet level 2
-<ul><li>bullet level 3
-<ol><li>Number on level 4
-</li></ol>
-</li></ul>
-</li><li>bullet level 2
-<ol><li>Number on level 3
-</li><li>Number on level 3
-</li></ol>
-</li></ul>
-<ol><li>number level 2
-</li></ol>
-</li><li>Level 1
-<ul><li><ul><li> Level 3
-</li></ul>
-</li></ul>
-</li></ul>
-<ol><li><ul><li><ul><li> Level 3, but ordered
-</li></ul>
-</li></ul>
-</li></ol>
-
-!! end
-
-!! test
-Nested lists 1
-!! input
-*foo
-**bar
-!! result
-<ul><li>foo
-<ul><li>bar
-</li></ul>
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 2
-!! input
-**foo
-*bar
-!! result
-<ul><li><ul><li>foo
-</li></ul>
-</li><li>bar
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 3 (first element empty)
-!! input
-*
-**bar
-!! result
-<ul><li>
-<ul><li>bar
-</li></ul>
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 4 (first element empty)
-!! input
-**
-*bar
-!! result
-<ul><li><ul><li>
-</li></ul>
-</li><li>bar
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 5 (both elements empty)
-!! input
-**
-*
-!! result
-<ul><li><ul><li>
-</li></ul>
-</li><li>
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 6 (both elements empty)
-!! input
-*
-**
-!! result
-<ul><li>
-<ul><li>
-</li></ul>
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 7 (skip initial nesting levels)
-!! input
-*** foo
-!! result
-<ul><li><ul><li><ul><li> foo
-</li></ul>
-</li></ul>
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 8 (multiple nesting transitions)
-!! input
-* foo
-*** bar
-** baz
-* boo
-!! result
-<ul><li> foo
-<ul><li><ul><li> bar
-</li></ul>
-</li><li> baz
-</li></ul>
-</li><li> boo
-</li></ul>
-
-!! end
-
-
-!! test
-List items are not parsed correctly following a <pre> block (bug 785)
-!! input
-* <pre>foo</pre>
-* <pre>bar</pre>
-* zar
-!! result
-<ul><li> <pre>foo</pre>
-</li><li> <pre>bar</pre>
-</li><li> zar
-</li></ul>
-
-!! end
-
-!! test
-List items from template
-!! input
-
-{{inner list}}
-* item 2
-
-* item 0
-{{inner list}}
-* item 2
-
-* item 0
-* notSOL{{inner list}}
-* item 2
-!! result
-<ul><li> item 1
-</li><li> item 2
-</li></ul>
-<ul><li> item 0
-</li><li> item 1
-</li><li> item 2
-</li></ul>
-<ul><li> item 0
-</li><li> notSOL
-</li><li> item 1
-</li><li> item 2
-</li></ul>
-
-!! end
-
-!! test
-List interrupted by empty line or heading
-!! input
-* foo
-
-** bar
-== A heading ==
-* Another list item
-!! result
-<ul><li> foo
-</li></ul>
-<ul><li><ul><li> bar
-</li></ul>
-</li></ul>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a>]</span> <span class="mw-headline" id="A_heading"> A heading </span></h2>
-<ul><li> Another list item
-</li></ul>
-
-!!end
-
-
-###
-### Magic Words
-###
-
-!! test
-Magic Word: {{CURRENTDAY}}
-!! input
-{{CURRENTDAY}}
-!! result
-<p>1
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTDAY2}}
-!! input
-{{CURRENTDAY2}}
-!! result
-<p>01
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTDAYNAME}}
-!! input
-{{CURRENTDAYNAME}}
-!! result
-<p>Thursday
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTDOW}}
-!! input
-{{CURRENTDOW}}
-!! result
-<p>4
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTMONTH}}
-!! input
-{{CURRENTMONTH}}
-!! result
-<p>01
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTMONTHABBREV}}
-!! input
-{{CURRENTMONTHABBREV}}
-!! result
-<p>Jan
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTMONTHNAME}}
-!! input
-{{CURRENTMONTHNAME}}
-!! result
-<p>January
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTMONTHNAMEGEN}}
-!! input
-{{CURRENTMONTHNAMEGEN}}
-!! result
-<p>January
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTTIME}}
-!! input
-{{CURRENTTIME}}
-!! result
-<p>00:02
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTWEEK}} (@bug 4594)
-!! input
-{{CURRENTWEEK}}
-!! result
-<p>1
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTYEAR}}
-!! input
-{{CURRENTYEAR}}
-!! result
-<p>1970
-</p>
-!! end
-
-!! test
-Magic Word: {{FULLPAGENAME}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{FULLPAGENAME}}
-!! result
-<p>User:Ævar Arnfjörð Bjarmason
-</p>
-!! end
-
-!! test
-Magic Word: {{FULLPAGENAMEE}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{FULLPAGENAMEE}}
-!! result
-<p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
-</p>
-!! end
-
-!! test
-Magic Word: {{NAMESPACE}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{NAMESPACE}}
-!! result
-<p>User
-</p>
-!! end
-
-!! test
-Magic Word: {{NAMESPACEE}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{NAMESPACEE}}
-!! result
-<p>User
-</p>
-!! end
-
-!! test
-Magic Word: {{NAMESPACENUMBER}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{NAMESPACENUMBER}}
-!! result
-<p>2
-</p>
-!! end
-
-!! test
-Magic Word: {{NUMBEROFFILES}}
-!! input
-{{NUMBEROFFILES}}
-!! result
-<p>2
-</p>
-!! end
-
-!! test
-Magic Word: {{PAGENAME}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{PAGENAME}}
-!! result
-<p>Ævar Arnfjörð Bjarmason
-</p>
-!! end
-
-!! test
-Magic Word: {{PAGENAME}} with metacharacters
-!! options
-title=[['foo & bar = baz']]
-!! input
-''{{PAGENAME}}''
-!! result
-<p><i>&#39;foo &#38; bar &#61; baz&#39;</i>
-</p>
-!! end
-
-!! test
-Magic Word: {{PAGENAME}} with metacharacters (bug 26781)
-!! options
-title=[[*RFC 1234 http://example.com/]]
-!! input
-{{PAGENAME}}
-!! result
-<p>&#42;RFC&#32;1234 http&#58;//example.com/
-</p>
-!! end
-
-!! test
-Magic Word: {{PAGENAMEE}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{PAGENAMEE}}
-!! result
-<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
-</p>
-!! end
-
-!! test
-Magic Word: {{PAGENAMEE}} with metacharacters (bug 26781)
-!! options
-title=[[*RFC 1234 http://example.com/]]
-!! input
-{{PAGENAMEE}}
-!! result
-<p>&#42;RFC_1234_http&#58;//example.com/
-</p>
-!! end
-
-!! test
-Magic Word: {{REVISIONID}}
-!! input
-{{REVISIONID}}
-!! result
-<p>1337
-</p>
-!! end
-
-!! test
-Magic Word: {{SCRIPTPATH}}
-!! input
-{{SCRIPTPATH}}
-!! result
-<p>/
-</p>
-!! end
-
-!! test
-Magic Word: {{SERVER}}
-!! input
-{{SERVER}}
-!! result
-<p><a rel="nofollow" class="external free" href="http://Britney-Spears">http://Britney-Spears</a>
-</p>
-!! end
-
-!! test
-Magic Word: {{SERVERNAME}}
-!! input
-{{SERVERNAME}}
-!! result
-<p>Britney-Spears
-</p>
-!! end
-
-!! test
-Magic Word: {{SITENAME}}
-!! input
-{{SITENAME}}
-!! result
-<p>MediaWiki
-</p>
-!! end
-
-!! test
-Namespace 1 {{ns:1}}
-!! input
-{{ns:1}}
-!! result
-<p>Talk
-</p>
-!! end
-
-!! test
-Namespace 1 {{ns:01}}
-!! input
-{{ns:01}}
-!! result
-<p>Talk
-</p>
-!! end
-
-!! test
-Namespace 0 {{ns:0}} (bug 4783)
-!! input
-{{ns:0}}
-!! result
-
-!! end
-
-!! test
-Namespace 0 {{ns:00}} (bug 4783)
-!! input
-{{ns:00}}
-!! result
-
-!! end
-
-!! test
-Namespace -1 {{ns:-1}}
-!! input
-{{ns:-1}}
-!! result
-<p>Special
-</p>
-!! end
-
-!! test
-Namespace User {{ns:User}}
-!! input
-{{ns:User}}
-!! result
-<p>User
-</p>
-!! end
-
-!! test
-Namespace User talk {{ns:User_talk}}
-!! input
-{{ns:User_talk}}
-!! result
-<p>User talk
-</p>
-!! end
-
-!! test
-Namespace User talk {{ns:uSeR tAlK}}
-!! input
-{{ns:uSeR tAlK}}
-!! result
-<p>User talk
-</p>
-!! end
-
-!! test
-Namespace File {{ns:File}}
-!! input
-{{ns:File}}
-!! result
-<p>File
-</p>
-!! end
-
-!! test
-Namespace File {{ns:Image}}
-!! input
-{{ns:Image}}
-!! result
-<p>File
-</p>
-!! end
-
-!! test
-Namespace (lang=de) Benutzer {{ns:User}}
-!! options
-language=de
-!! input
-{{ns:User}}
-!! result
-<p>Benutzer
-</p>
-!! end
-
-!! test
-Namespace (lang=de) Benutzer Diskussion {{ns:3}}
-!! options
-language=de
-!! input
-{{ns:3}}
-!! result
-<p>Benutzer Diskussion
-</p>
-!! end
-
-
-!! test
-Urlencode
-!! input
-{{urlencode:hi world?!}}
-{{urlencode:hi world?!|WIKI}}
-{{urlencode:hi world?!|PATH}}
-{{urlencode:hi world?!|QUERY}}
-!! result
-<p>hi+world%3F%21
-hi_world%3F!
-hi%20world%3F%21
-hi+world%3F%21
-</p>
-!! end
-
-###
-### Magic links
-###
-!! test
-Magic links: internal link to RFC (bug 479)
-!! input
-[[RFC 123]]
-!! result
-<p><a href="/index.php?title=RFC_123&amp;action=edit&amp;redlink=1" class="new" title="RFC 123 (page does not exist)">RFC 123</a>
-</p>
-!! end
-
-!! test
-Magic links: RFC (bug 479)
-!! input
-RFC 822
-!! result
-<p><a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc822">RFC 822</a>
-</p>
-!! end
-
-!! test
-Magic links: ISBN (bug 1937)
-!! input
-ISBN 0-306-40615-2
-!! result
-<p><a href="/wiki/Special:BookSources/0306406152" class="internal mw-magiclink-isbn">ISBN 0-306-40615-2</a>
-</p>
-!! end
-
-!! test
-Magic links: PMID incorrectly converts space to underscore
-!! input
-PMID 1234
-!! result
-<p><a class="external mw-magiclink-pmid" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
-</p>
-!! end
-
-###
-### Templates
-####
-
-!! test
-Nonexistent template
-!! input
-{{thistemplatedoesnotexist}}
-!! result
-<p><a href="/index.php?title=Template:Thistemplatedoesnotexist&amp;action=edit&amp;redlink=1" class="new" title="Template:Thistemplatedoesnotexist (page does not exist)">Template:Thistemplatedoesnotexist</a>
-</p>
-!! end
-
-!! article
-Template:test
-!! text
-This is a test template
-!! endarticle
-
-!! test
-Simple template
-!! input
-{{test}}
-!! result
-<p>This is a test template
-</p>
-!! end
-
-!! test
-Template with explicit namespace
-!! input
-{{Template:test}}
-!! result
-<p>This is a test template
-</p>
-!! end
-
-
-!! article
-Template:paramtest
-!! text
-This is a test template with parameter {{{param}}}
-!! endarticle
-
-!! test
-Template parameter
-!! input
-{{paramtest|param=foo}}
-!! result
-<p>This is a test template with parameter foo
-</p>
-!! end
-
-!! article
-Template:paramtestnum
-!! text
-[[{{{1}}}|{{{2}}}]]
-!! endarticle
-
-!! test
-Template unnamed parameter
-!! input
-{{paramtestnum|Main Page|the main page}}
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">the main page</a>
-</p>
-!! end
-
-!! article
-Template:templatesimple
-!! text
-(test)
-!! endarticle
-
-!! article
-Template:templateredirect
-!! text
-#redirect [[Template:templatesimple]]
-!! endarticle
-
-!! article
-Template:templateasargtestnum
-!! text
-{{{{{1}}}}}
-!! endarticle
-
-!! article
-Template:templateasargtest
-!! text
-{{template{{{templ}}}}}
-!! endarticle
-
-!! article
-Template:templateasargtest2
-!! text
-{{{{{templ}}}}}
-!! endarticle
-
-!! test
-Template with template name as unnamed argument
-!! input
-{{templateasargtestnum|templatesimple}}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! test
-Template with template name as argument
-!! input
-{{templateasargtest|templ=simple}}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! test
-Template with template name as argument (2)
-!! input
-{{templateasargtest2|templ=templatesimple}}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! article
-Template:templateasargtestdefault
-!! text
-{{{{{templ|templatesimple}}}}}
-!! endarticle
-
-!! article
-Template:templa
-!! text
-'''templ'''
-!! endarticle
-
-!! test
-Template with default value
-!! input
-{{templateasargtestdefault}}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! test
-Template with default value (value set)
-!! input
-{{templateasargtestdefault|templ=templa}}
-!! result
-<p><b>templ</b>
-</p>
-!! end
-
-!! test
-Template redirect
-!! input
-{{templateredirect}}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! test
-Template with argument in separate line
-!! input
-{{ templateasargtest |
- templ = simple }}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! test
-Template with complex template as argument
-!! input
-{{paramtest|
- param ={{ templateasargtest |
- templ = simple }}}}
-!! result
-<p>This is a test template with parameter (test)
-</p>
-!! end
-
-!! test
-Template with thumb image (with link in description)
-!! input
-{{paramtest|
- param =[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}}
-!! result
-This is a test template with parameter <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Noimage.png" class="new" title="File:Noimage.png">File:Noimage.png</a> <div class="thumbcaption"><a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">link</a> <a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">caption</a></div></div></div>
-
-!! end
-
-!! article
-Template:complextemplate
-!! text
-{{{1}}} {{paramtest|
- param ={{{param}}}}}
-!! endarticle
-
-!! test
-Template with complex arguments
-!! input
-{{complextemplate|
- param ={{ templateasargtest |
- templ = simple }}|[[Template:complextemplate|link]]}}
-!! result
-<p><a href="/wiki/Template:Complextemplate" title="Template:Complextemplate">link</a> This is a test template with parameter (test)
-</p>
-!! end
-
-!! test
-BUG 553: link with two variables in a piped link
-!! input
-{|
-|[[{{{1}}}|{{{2}}}]]
-|}
-!! result
-<table>
-<tr>
-<td>[[{{{1}}}|{{{2}}}]]
-</td></tr></table>
-
-!! end
-
-!! test
-Magic variable as template parameter
-!! input
-{{paramtest|param={{SITENAME}}}}
-!! result
-<p>This is a test template with parameter MediaWiki
-</p>
-!! end
-
-!! article
-Template:linktest
-!! text
-[[{{{param}}}|link]]
-!! endarticle
-
-!! test
-Template parameter as link source
-!! input
-{{linktest|param=Main Page}}
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">link</a>
-</p>
-!! end
-
-
-!!article
-Template:paramtest2
-!! text
-including another template, {{paramtest|param={{{arg}}}}}
-!! endarticle
-
-!! test
-Template passing argument to another template
-!! input
-{{paramtest2|arg='hmm'}}
-!! result
-<p>including another template, This is a test template with parameter 'hmm'
-</p>
-!! end
-
-!! article
-Template:Linktest2
-!! text
-Main Page
-!! endarticle
-
-!! test
-Template as link source
-!! input
-[[{{linktest2}}]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
-!! end
-
-
-!! article
-Template:loop1
-!! text
-{{loop2}}
-!! endarticle
-
-!! article
-Template:loop2
-!! text
-{{loop1}}
-!! endarticle
-
-!! test
-Template infinite loop
-!! input
-{{loop1}}
-!! result
-<p><span class="error">Template loop detected: <a href="/wiki/Template:Loop1" title="Template:Loop1">Template:Loop1</a></span>
-</p>
-!! end
-
-!! test
-Template from main namespace
-!! input
-{{:Main Page}}
-!! result
-<p>blah blah
-</p>
-!! end
-
-!! article
-Template:table
-!! text
-{|
-| 1 || 2
-|-
-| 3 || 4
-|}
-!! endarticle
-
-!! test
-BUG 529: Template with table, not included at beginning of line
-!! input
-foo {{table}}
-!! result
-<p>foo
-</p>
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
-
-!! end
-
-!! test
-BUG 523: Template shouldn't eat newline (or add an extra one before table)
-!! input
-foo
-{{table}}
-!! result
-<p>foo
-</p>
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
-
-!! end
-
-!! test
-BUG 41: Template parameters shown as broken links
-!! input
-{{{parameter}}}
-!! result
-<p>{{{parameter}}}
-</p>
-!! end
-
-
-!! article
-Template:MSGNW test
-!! text
-''None'' of '''this''' should be
-* interpreted
- but rather passed unmodified
-{{test}}
-!! endarticle
-
-# hmm, fix this or just deprecate msgnw and document its behavior?
-!! test
-msgnw keyword
-!! options
-disabled
-!! input
-{{msgnw:MSGNW test}}
-!! result
-<p>''None'' of '''this''' should be
-* interpreted
- but rather passed unmodified
-{{test}}
-</p>
-!! end
-
-!! test
-int keyword
-!! input
-{{int:youhavenewmessages|lots of money|not!}}
-!! result
-<p>You have lots of money (not!).
-</p>
-!! end
-
-!! article
-Template:Includes
-!! text
-Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
-!! endarticle
-
-!! test
-<includeonly> and <noinclude> being included
-!! input
-{{Includes}}
-!! result
-<p>Foobar
-</p>
-!! end
-
-!! article
-Template:Includes2
-!! text
-<onlyinclude>Foo</onlyinclude>bar
-!! endarticle
-
-!! test
-<onlyinclude> being included
-!! input
-{{Includes2}}
-!! result
-<p>Foo
-</p>
-!! end
-
-
-!! article
-Template:Includes3
-!! text
-<onlyinclude>Foo</onlyinclude>bar<includeonly>zar</includeonly>
-!! endarticle
-
-!! test
-<onlyinclude> and <includeonly> being included
-!! input
-{{Includes3}}
-!! result
-<p>Foo
-</p>
-!! end
-
-!! test
-<includeonly> and <noinclude> on a page
-!! input
-Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
-!! result
-<p>Foozar
-</p>
-!! end
-
-!! test
-<onlyinclude> on a page
-!! input
-<onlyinclude>Foo</onlyinclude>bar
-!! result
-<p>Foobar
-</p>
-!! end
-
-!! article
-Template:Includeonly section
-!! text
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section T-1==
-!!endarticle
-
-!! test
-Bug 6563: Edit link generation for section shown by <includeonly>
-!! input
-{{includeonly section}}
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Includeonly_section">Includeonly section</span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Section_T-1">Section T-1</span></h2>
-
-!! end
-
-# Uses same input as the contents of [[Template:Includeonly section]]
-!! test
-Bug 6563: Section extraction for section shown by <includeonly>
-!! options
-section=T-2
-!! input
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section T-2==
-!! result
-==Section T-2==
-!! end
-
-!! test
-Bug 6563: Edit link generation for section suppressed by <includeonly>
-!! input
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section 1==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-
-!! end
-
-!! test
-Bug 6563: Section extraction for section suppressed by <includeonly>
-!! options
-section=1
-!! input
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section 1==
-!! result
-==Section 1==
-!! end
-
-###
-### Pre-save transform tests
-###
-!! test
-pre-save transform: subst:
-!! options
-PST
-!! input
-{{subst:test}}
-!! result
-This is a test template
-!! end
-
-!! test
-pre-save transform: normal template
-!! options
-PST
-!! input
-{{test}}
-!! result
-{{test}}
-!! end
-
-!! test
-pre-save transform: nonexistent template
-!! options
-PST
-!! input
-{{thistemplatedoesnotexist}}
-!! result
-{{thistemplatedoesnotexist}}
-!! end
-
-
-!! test
-pre-save transform: subst magic variables
-!! options
-PST
-!! input
-{{subst:SITENAME}}
-!! result
-MediaWiki
-!! end
-
-# This is bug 89, which I fixed. -- wtm
-!! test
-pre-save transform: subst: templates with parameters
-!! options
-pst
-!! input
-{{subst:paramtest|param="something else"}}
-!! result
-This is a test template with parameter "something else"
-!! end
-
-!! article
-Template:nowikitest
-!! text
-<nowiki>'''not wiki'''</nowiki>
-!! endarticle
-
-!! test
-pre-save transform: nowiki in subst (bug 1188)
-!! options
-pst
-!! input
-{{subst:nowikitest}}
-!! result
-<nowiki>'''not wiki'''</nowiki>
-!! end
-
-
-!! article
-Template:commenttest
-!! text
-This template has <!-- a comment --> in it.
-!! endarticle
-
-!! test
-pre-save transform: comment in subst (bug 1936)
-!! options
-pst
-!! input
-{{subst:commenttest}}
-!! result
-This template has <!-- a comment --> in it.
-!! end
-
-!! test
-pre-save transform: unclosed tag
-!! options
-pst noxml
-!! input
-<nowiki>'''not wiki'''
-!! result
-<nowiki>'''not wiki'''
-!! end
-
-!! test
-pre-save transform: mixed tag case
-!! options
-pst noxml
-!! input
-<NOwiki>'''not wiki'''</noWIKI>
-!! result
-<NOwiki>'''not wiki'''</noWIKI>
-!! end
-
-!! test
-pre-save transform: unclosed comment in <nowiki>
-!! options
-pst noxml
-!! input
-wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
-!! result
-wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
-!!end
-
-!! article
-Template:dangerous
-!!text
-<span onmouseover="alert('crap')">Oh no</span>
-!!endarticle
-
-!!test
-(confirming safety of fix for subst bug 1936)
-!! input
-{{Template:dangerous}}
-!! result
-<p><span>Oh no</span>
-</p>
-!! end
-
-!! test
-pre-save transform: comment containing gallery (bug 5024)
-!! options
-pst
-!! input
-<!-- <gallery>data</gallery> -->
-!!result
-<!-- <gallery>data</gallery> -->
-!!end
-
-!! test
-pre-save transform: comment containing extension
-!! options
-pst
-!! input
-<!-- <tag>data</tag> -->
-!!result
-<!-- <tag>data</tag> -->
-!!end
-
-!! test
-pre-save transform: comment containing nowiki
-!! options
-pst
-!! input
-<!-- <nowiki>data</nowiki> -->
-!!result
-<!-- <nowiki>data</nowiki> -->
-!!end
-
-!! test
-pre-save transform: <noinclude> in subst (bug 3298)
-!! options
-pst
-!! input
-{{subst:Includes}}
-!! result
-Foobar
-!! end
-
-!! test
-pre-save transform: <onlyinclude> in subst (bug 3298)
-!! options
-pst
-!! input
-{{subst:Includes2}}
-!! result
-Foo
-!! end
-
-!! article
-Template:SubstTest
-!!text
-{{<includeonly>subst:</includeonly>Includes}}
-!! endarticle
-
-!! article
-Template:SafeSubstTest
-!! text
-{{<includeonly>safesubst:</includeonly>Includes}}
-!! endarticle
-
-!! test
-bug 22297: safesubst: works during PST
-!! options
-pst
-!! input
-{{subst:SafeSubstTest}}{{safesubst:SubstTest}}
-!! result
-FoobarFoobar
-!! end
-
-!! test
-bug 22297: safesubst: works during normal parse
-!! input
-{{SafeSubstTest}}
-!! result
-<p>Foobar
-</p>
-!! end
-
-!! test:
-subst: does not work during normal parse
-!! input
-{{SubstTest}}
-!! result
-<p>{{subst:Includes}}
-</p>
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick")
-!! options
-pst
-!! input
-[[Article (context)|]]
-[[Bar:Article|]]
-[[:Bar:Article|]]
-[[Bar:Article (context)|]]
-[[:Bar:Article (context)|]]
-[[|Article]]
-[[|Article (context)]]
-[[Bar:X (Y) Z|]]
-[[:Bar:X (Y) Z|]]
-!! result
-[[Article (context)|Article]]
-[[Bar:Article|Article]]
-[[:Bar:Article|Article]]
-[[Bar:Article (context)|Article]]
-[[:Bar:Article (context)|Article]]
-[[Article]]
-[[Article (context)]]
-[[Bar:X (Y) Z|X (Y) Z]]
-[[:Bar:X (Y) Z|X (Y) Z]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with interwiki prefix
-!! options
-pst
-!! input
-[[interwiki:Article|]]
-[[:interwiki:Article|]]
-[[interwiki:Bar:Article|]]
-[[:interwiki:Bar:Article|]]
-!! result
-[[interwiki:Article|Article]]
-[[:interwiki:Article|Article]]
-[[interwiki:Bar:Article|Bar:Article]]
-[[:interwiki:Bar:Article|Bar:Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with parens in title
-!! options
-pst title=[[Somearticle (context)]]
-!! input
-[[|Article]]
-!! result
-[[Article (context)|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with comma in title
-!! options
-pst title=[[Someplace, Somewhere]]
-!! input
-[[|Otherplace]]
-[[Otherplace, Elsewhere|]]
-[[Otherplace, Elsewhere, Anywhere|]]
-!! result
-[[Otherplace, Somewhere|Otherplace]]
-[[Otherplace, Elsewhere|Otherplace]]
-[[Otherplace, Elsewhere, Anywhere|Otherplace]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with parens and comma
-!! options
-pst title=[[Someplace (IGNORED), Somewhere]]
-!! input
-[[|Otherplace]]
-[[Otherplace (place), Elsewhere|]]
-!! result
-[[Otherplace, Somewhere|Otherplace]]
-[[Otherplace (place), Elsewhere|Otherplace]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with comma and parens
-!! options
-pst title=[[Who, me? (context)]]
-!! input
-[[|Yes, you.]]
-[[Me, Myself, and I (1937 song)|]]
-!! result
-[[Yes, you. (context)|Yes, you.]]
-[[Me, Myself, and I (1937 song)|Me, Myself, and I]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace
-!! options
-pst title=[[Ns:Somearticle]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace and parens
-!! options
-pst title=[[Ns:Somearticle (context)]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article (context)|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace and comma
-!! options
-pst title=[[Ns:Somearticle, Context, Whatever]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article, Context, Whatever|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace, comma and parens
-!! options
-pst title=[[Ns:Somearticle, Context (context)]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article (context)|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace, parens and comma
-!! options
-pst title=[[Ns:Somearticle (IGNORED), Context]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article, Context|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with full-width parens and no space (Japanese and Chinese style, bug 30149)
-!! options
-pst
-!! input
-[[Article(context)|]]
-[[Bar:Article(context)|]]
-[[:Bar:Article(context)|]]
-[[|Article(context)]]
-[[Bar:X(Y)Z|]]
-[[:Bar:X(Y)Z|]]
-!! result
-[[Article(context)|Article]]
-[[Bar:Article(context)|Article]]
-[[:Bar:Article(context)|Article]]
-[[Article(context)]]
-[[Bar:X(Y)Z|X(Y)Z]]
-[[:Bar:X(Y)Z|X(Y)Z]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with full-width parens and space (Japanese and Chinese style, bug 30149)
-!! options
-pst
-!! input
-[[Article (context)|]]
-[[Bar:Article (context)|]]
-[[:Bar:Article (context)|]]
-[[|Article (context)]]
-[[Bar:X (Y) Z|]]
-[[:Bar:X (Y) Z|]]
-!! result
-[[Article (context)|Article]]
-[[Bar:Article (context)|Article]]
-[[:Bar:Article (context)|Article]]
-[[Article (context)]]
-[[Bar:X (Y) Z|X (Y) Z]]
-[[:Bar:X (Y) Z|X (Y) Z]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with parens and no space (Korean style, bug 30149)
-!! options
-pst
-!! input
-[[Article(context)|]]
-[[Bar:Article(context)|]]
-[[:Bar:Article(context)|]]
-[[|Article(context)]]
-[[Bar:X(Y)Z|]]
-[[:Bar:X(Y)Z|]]
-!! result
-[[Article(context)|Article]]
-[[Bar:Article(context)|Article]]
-[[:Bar:Article(context)|Article]]
-[[Article(context)]]
-[[Bar:X(Y)Z|X(Y)Z]]
-[[:Bar:X(Y)Z|X(Y)Z]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with commas (bug 21660)
-!! options
-pst
-!! input
-[[Article (context), context|]]
-[[Article (context),context|]]
-[[Bar:Article (context), context|]]
-[[Bar:Article (context),context|]]
-[[:Bar:Article (context), context|]]
-[[:Bar:Article (context),context|]]
-!! result
-[[Article (context), context|Article]]
-[[Article (context),context|Article]]
-[[Bar:Article (context), context|Article]]
-[[Bar:Article (context),context|Article]]
-[[:Bar:Article (context), context|Article]]
-[[:Bar:Article (context),context|Article]]
-!! end
-
-!! test
-pre-save transform: trim trailing empty lines
-!! options
-pst
-!! input
-Empty lines are trimmed
-
-
-
-
-!! result
-Empty lines are trimmed
-!! end
-
-!! test
-pre-save transform: Signature expansion
-!! options
-pst
-!! input
-* ~~~
-* <noinclude>~~~</noinclude>
-* <includeonly>~~~</includeonly>
-* <onlyinclude>~~~</onlyinclude>
-!! result
-* [[Special:Contributions/127.0.0.1|127.0.0.1]]
-* <noinclude>[[Special:Contributions/127.0.0.1|127.0.0.1]]</noinclude>
-* <includeonly>[[Special:Contributions/127.0.0.1|127.0.0.1]]</includeonly>
-* <onlyinclude>[[Special:Contributions/127.0.0.1|127.0.0.1]]</onlyinclude>
-!! end
-
-
-!! test
-pre-save transform: Signature expansion in nowiki tags (bug 93)
-!! options
-pst disabled
-!! input
-Shall not expand:
-
-<nowiki>~~~~</nowiki>
-
-<includeonly><nowiki>~~~~</nowiki></includeonly>
-
-<noinclude><nowiki>~~~~</nowiki></noinclude>
-
-<onlyinclude><nowiki>~~~~</nowiki></onlyinclude>
-
-{{subst:Foo}} shall be converted to FOO
-
-As well as inside noinclude/onlyinclude
-<noinclude>{{subst:Foo}}</noinclude>
-<onlyinclude>{{subst:Foo}}</onlyinclude>
-
-But not inside includeonly
-<includeonly>{{subst:Foo}}</includeonly>
-!! result
-Shall not expand:
-
-<nowiki>~~~~</nowiki>
-
-<includeonly><nowiki>~~~~</nowiki></includeonly>
-
-<noinclude><nowiki>~~~~</nowiki></noinclude>
-
-<onlyinclude><nowiki>~~~~</nowiki></onlyinclude>
-
-FOO shall be converted to FOO
-
-As well as inside noinclude/onlyinclude
-<noinclude>FOO</noinclude>
-<onlyinclude>FOO</onlyinclude>
-
-But not inside includeonly
-<includeonly>{{subst:Foo}}</includeonly>
-!! end
-
-###
-### Message transform tests
-###
-!! test
-message transform: magic variables
-!! options
-msg
-!! input
-{{SITENAME}}
-!! result
-MediaWiki
-!! end
-
-!! test
-message transform: should not transform wiki markup
-!! options
-msg
-!! input
-''test''
-!! result
-''test''
-!! end
-
-!! test
-message transform: <noinclude> in transcluded template (bug 4926)
-!! options
-msg
-!! input
-{{Includes}}
-!! result
-Foobar
-!! end
-
-!! test
-message transform: <onlyinclude> in transcluded template (bug 4926)
-!! options
-msg
-!! input
-{{Includes2}}
-!! result
-Foo
-!! end
-
-!! test
-{{#special:}} page name, known
-!! options
-msg
-!! input
-{{#special:Recentchanges}}
-!! result
-Special:RecentChanges
-!! end
-
-!! test
-{{#special:}} page name with subpage, known
-!! options
-msg
-!! input
-{{#special:Recentchanges/param}}
-!! result
-Special:RecentChanges/param
-!! end
-
-!! test
-{{#special:}} page name, unknown
-!! options
-msg
-!! input
-{{#special:foobarnonexistent}}
-!! result
-No such special page
-!! end
-
-!! test
-{{#speciale:}} page name, known
-!! options
-msg
-!! input
-{{#speciale:Recentchanges}}
-!! result
-Special:RecentChanges
-!! end
-
-!! test
-{{#speciale:}} page name with subpage, known
-!! options
-msg
-!! input
-{{#speciale:Recentchanges/param}}
-!! result
-Special:RecentChanges/param
-!! end
-
-!! test
-{{#speciale:}} page name, unknown
-!! options
-msg
-!! input
-{{#speciale:foobarnonexistent}}
-!! result
-No_such_special_page
-!! end
-
-###
-### Images
-###
-!! test
-Simple image
-!! input
-[[Image:foobar.jpg]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Right-aligned image
-!! input
-[[Image:foobar.jpg|right]]
-!! result
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-
-!! end
-
-!! test
-Simple image (using File: namespace, now canonical)
-!! input
-[[File:foobar.jpg]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with caption
-!! input
-[[Image:foobar.jpg|right|Caption text]]
-!! result
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-
-!! end
-
-!! test
-Image with link parameter, wiki target
-!! input
-[[Image:foobar.jpg|link=Target page]]
-!! result
-<p><a href="/wiki/Target_page" title="Target page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with link parameter, URL target
-!! input
-[[Image:foobar.jpg|link=http://example.com/]]
-!! result
-<p><a href="http://example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with link parameter, wgExternalLinkTarget
-!! input
-[[Image:foobar.jpg|link=http://example.com/]]
-!! config
-wgExternalLinkTarget='foobar'
-!! result
-<p><a href="http://example.com/" target="foobar" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with link parameter, wgNoFollowLinks set to false
-!! input
-[[Image:foobar.jpg|link=http://example.com/]]
-!! config
-wgNoFollowLinks=false
-!! result
-<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with link parameter, wgNoFollowDomainExceptions
-!! input
-[[Image:foobar.jpg|link=http://example.com/]]
-!! config
-wgNoFollowDomainExceptions='example.com'
-!! result
-<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with link parameter, wgExternalLinkTarget, unnamed parameter
-!! input
-[[Image:foobar.jpg|link=http://example.com/|Title]]
-!! config
-wgExternalLinkTarget='foobar'
-!! result
-<p><a href="http://example.com/" title="Title" target="foobar" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with empty link parameter
-!! input
-[[Image:foobar.jpg|link=]]
-!! result
-<p><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" />
-</p>
-!! end
-
-!! test
-Image with link parameter (wiki target) and unnamed parameter
-!! input
-[[Image:foobar.jpg|link=Target page|Title]]
-!! result
-<p><a href="/wiki/Target_page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with link parameter (URL target) and unnamed parameter
-!! input
-[[Image:foobar.jpg|link=http://example.com/|Title]]
-!! result
-<p><a href="http://example.com/" title="Title" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Thumbnail image with link parameter
-!! input
-[[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="http://example.com/"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
-
-!! end
-
-!! test
-Image with frame and link
-!! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
-!! result
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
-
-!! end
-
-!! test
-Image with frame and link and explicit alt
-!! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]]
-!! result
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
-
-!! end
-
-!! test
-Image with wiki markup in implicit alt
-!! input
-[[Image:Foobar.jpg|testing '''bold''' in alt]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="testing bold in alt"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with wiki markup in explicit alt
-!! input
-[[Image:Foobar.jpg|alt=testing '''bold''' in alt]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Link to image page- image page normally doesn't exists, hence edit link
-Add test with existing image page
-#<p><a href="/wiki/File:Test" title="Image:Test">Image:test</a>
-!! input
-[[:Image:test]]
-!! result
-<p><a href="/index.php?title=File:Test&amp;action=edit&amp;redlink=1" class="new" title="File:Test (page does not exist)">Image:test</a>
-</p>
-!! end
-
-!! test
-bug 18784 Link to non-existent image page with caption should use caption as link text
-!! input
-[[:Image:test|caption]]
-!! result
-<p><a href="/index.php?title=File:Test&amp;action=edit&amp;redlink=1" class="new" title="File:Test (page does not exist)">caption</a>
-</p>
-!! end
-
-!! test
-Frameless image caption with a free URL
-!! input
-[[Image:foobar.jpg|http://example.com]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="http://example.com"><img alt="http://example.com" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Thumbnail image caption with a free URL
-!! input
-[[Image:foobar.jpg|thumb|http://example.com]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
-
-!! end
-
-!! test
-Thumbnail image caption with a free URL and explicit alt
-!! input
-[[Image:foobar.jpg|thumb|http://example.com|alt=Alteration]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Alteration" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
-
-!! end
-
-!! test
-BUG 1887: A ISBN with a thumbnail
-!! input
-[[Image:foobar.jpg|thumb|ISBN 1235467890]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div>
-
-!! end
-
-!! test
-BUG 1887: A RFC with a thumbnail
-!! input
-[[Image:foobar.jpg|thumb|This is RFC 12354]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is <a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
-
-!! end
-
-!! test
-BUG 1887: A mailto link with a thumbnail
-!! input
-[[Image:foobar.jpg|thumb|Please mailto:nobody@example.com]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div>
-
-!! end
-
-# Pending resolution to bug 368
-!! test
-BUG 648: Frameless image caption with a link
-!! input
-[[Image:foobar.jpg|text with a [[link]] in it]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-BUG 648: Frameless image caption with a link (suffix)
-!! input
-[[Image:foobar.jpg|text with a [[link]]foo in it]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a linkfoo in it"><img alt="text with a linkfoo in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-BUG 648: Frameless image caption with an interwiki link
-!! input
-[[Image:foobar.jpg|text with a [[MeatBall:Link]] in it]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a MeatBall:Link in it"><img alt="text with a MeatBall:Link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-BUG 648: Frameless image caption with a piped interwiki link
-!! input
-[[Image:foobar.jpg|text with a [[MeatBall:Link|link]] in it]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Escape HTML special chars in image alt text
-!! input
-[[Image:foobar.jpg|& < > "]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-BUG 499: Alt text should have &#1234;, not &amp;1234;
-!! input
-[[Image:foobar.jpg|&#9792;]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="♀"><img alt="♀" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Broken image caption with link
-!! input
-[[Image:Foobar.jpg|thumb|This is a broken caption. But [[Main Page|this]] is just an ordinary link.
-!! result
-<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a href="/wiki/Main_Page" title="Main Page">this</a> is just an ordinary link.
-</p>
-!! end
-
-!! test
-Image caption containing another image
-!! input
-[[Image:Foobar.jpg|thumb|This is a caption with another [[Image:icon.png|image]] inside it!]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption with another <a href="/index.php?title=Special:Upload&amp;wpDestFile=Icon.png" class="new" title="File:Icon.png">image</a> inside it!</div></div></div>
-
-!! end
-
-!! test
-Image caption containing a newline
-!! input
-[[Image:Foobar.jpg|This
-*is some text]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="This *is some text"><img alt="This *is some text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!!end
-
-
-!! test
-Bug 3090: External links other than http: in image captions
-!! input
-[[Image:Foobar.jpg|thumb|200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="200" height="23" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This caption has <a rel="nofollow" class="external text" href="irc://example.net">irc</a> and <a rel="nofollow" class="external text" href="https://example.com">Secure</a> ext links in it.</div></div></div>
-
-!! end
-
-!! test
-Custom class
-!! input
-[[Image:foobar.jpg|a|class=b]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="a"><img alt="a" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="b" /></a>
-</p>
-!! end
-
-!! article
-File:Barfoo.jpg
-!! text
-#REDIRECT [[File:Barfoo.jpg]]
-!! endarticle
-
-!! test
-Redirected image
-!! input
-[[Image:Barfoo.jpg]]
-!! result
-<p><a href="/wiki/File:Barfoo.jpg" title="File:Barfoo.jpg">File:Barfoo.jpg</a>
-</p>
-!! end
-
-!! test
-Missing image with uploads disabled
-!! options
-wgEnableUploads=0
-!! input
-[[Image:Foobaz.jpg]]
-!! result
-<p><a href="/wiki/File:Foobaz.jpg" title="File:Foobaz.jpg">File:Foobaz.jpg</a>
-</p>
-!! end
-
-
-###
-### Subpages
-###
-!! article
-Subpage test/subpage
-!! text
-foo
-!! endarticle
-
-!! test
-Subpage link
-!! options
-subpage title=[[Subpage test]]
-!! input
-[[/subpage]]
-!! result
-<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a>
-</p>
-!! end
-
-!! test
-Subpage noslash link
-!! options
-subpage title=[[Subpage test]]
-!!input
-[[/subpage/]]
-!! result
-<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">subpage</a>
-</p>
-!! end
-
-!! test
-Disabled subpages
-!! input
-[[/subpage]]
-!! result
-<p><a href="/index.php?title=/subpage&amp;action=edit&amp;redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a>
-</p>
-!! end
-
-!! test
-BUG 561: {{/Subpage}}
-!! options
-subpage title=[[Page]]
-!! input
-{{/Subpage}}
-!! result
-<p><a href="/index.php?title=Page/Subpage&amp;action=edit&amp;redlink=1" class="new" title="Page/Subpage (page does not exist)">Page/Subpage</a>
-</p>
-!! end
-
-###
-### Categories
-###
-!! article
-Category:MediaWiki User's Guide
-!! text
-blah
-!! endarticle
-
-!! test
-Link to category
-!! input
-[[:Category:MediaWiki User's Guide]]
-!! result
-<p><a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">Category:MediaWiki User's Guide</a>
-</p>
-!! end
-
-!! test
-Simple category
-!! options
-cat
-!! input
-[[Category:MediaWiki User's Guide]]
-!! result
-<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
-!! end
-
-!! test
-PAGESINCATEGORY invalid title fatal (r33546 fix)
-!! input
-{{PAGESINCATEGORY:<bogus>}}
-!! result
-<p>0
-</p>
-!! end
-
-###
-### Inter-language links
-###
-!! test
-Inter-language links
-!! options
-ill
-!! input
-[[es:Alimento]]
-[[fr:Nourriture]]
-[[zh:&#39135;&#21697;]]
-!! result
-es:Alimento fr:Nourriture zh:食品
-!! end
-
-###
-### Sections
-###
-!! test
-Basic section headings
-!! input
-== Headline 1 ==
-Some text
-
-==Headline 2==
-More
-===Smaller headline===
-Blah blah
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
-<p>Some text
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2">Headline 2</span></h2>
-<p>More
-</p>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a>]</span> <span class="mw-headline" id="Smaller_headline">Smaller headline</span></h3>
-<p>Blah blah
-</p>
-!! end
-
-!! test
-Section headings with TOC
-!! input
-== Headline 1 ==
-=== Subheadline 1 ===
-===== Skipping a level =====
-====== Skipping a level ======
-
-== Headline 2 ==
-Some text
-===Another headline===
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#Subheadline_1"><span class="tocnumber">1.1</span> <span class="toctext">Subheadline 1</span></a>
-<ul>
-<li class="toclevel-3 tocsection-3"><a href="#Skipping_a_level"><span class="tocnumber">1.1.1</span> <span class="toctext">Skipping a level</span></a>
-<ul>
-<li class="toclevel-4 tocsection-4"><a href="#Skipping_a_level_2"><span class="tocnumber">1.1.1.1</span> <span class="toctext">Skipping a level</span></a></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-5"><a href="#Headline_2"><span class="tocnumber">2</span> <span class="toctext">Headline 2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-6"><a href="#Another_headline"><span class="tocnumber">2.1</span> <span class="toctext">Another headline</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a>]</span> <span class="mw-headline" id="Subheadline_1"> Subheadline 1 </span></h3>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level"> Skipping a level </span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level_2"> Skipping a level </span></h6>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2"> Headline 2 </span></h2>
-<p>Some text
-</p>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a>]</span> <span class="mw-headline" id="Another_headline">Another headline</span></h3>
-
-!! end
-
-# perl -e 'print "="x$_," Level $_ heading","="x$_,"\n" for 1..10'
-!! test
-Handling of sections up to level 6 and beyond
-!! input
-= Level 1 Heading=
-== Level 2 Heading==
-=== Level 3 Heading===
-==== Level 4 Heading====
-===== Level 5 Heading=====
-====== Level 6 Heading======
-======= Level 7 Heading=======
-======== Level 8 Heading========
-========= Level 9 Heading=========
-========== Level 10 Heading==========
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#Level_2_Heading"><span class="tocnumber">1.1</span> <span class="toctext">Level 2 Heading</span></a>
-<ul>
-<li class="toclevel-3 tocsection-3"><a href="#Level_3_Heading"><span class="tocnumber">1.1.1</span> <span class="toctext">Level 3 Heading</span></a>
-<ul>
-<li class="toclevel-4 tocsection-4"><a href="#Level_4_Heading"><span class="tocnumber">1.1.1.1</span> <span class="toctext">Level 4 Heading</span></a>
-<ul>
-<li class="toclevel-5 tocsection-5"><a href="#Level_5_Heading"><span class="tocnumber">1.1.1.1.1</span> <span class="toctext">Level 5 Heading</span></a>
-<ul>
-<li class="toclevel-6 tocsection-6"><a href="#Level_6_Heading"><span class="tocnumber">1.1.1.1.1.1</span> <span class="toctext">Level 6 Heading</span></a></li>
-<li class="toclevel-6 tocsection-7"><a href="#.3D_Level_7_Heading.3D"><span class="tocnumber">1.1.1.1.1.2</span> <span class="toctext">= Level 7 Heading=</span></a></li>
-<li class="toclevel-6 tocsection-8"><a href="#.3D.3D_Level_8_Heading.3D.3D"><span class="tocnumber">1.1.1.1.1.3</span> <span class="toctext">== Level 8 Heading==</span></a></li>
-<li class="toclevel-6 tocsection-9"><a href="#.3D.3D.3D_Level_9_Heading.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.4</span> <span class="toctext">=== Level 9 Heading===</span></a></li>
-<li class="toclevel-6 tocsection-10"><a href="#.3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.5</span> <span class="toctext">==== Level 10 Heading====</span></a></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a>]</span> <span class="mw-headline" id="Level_1_Heading"> Level 1 Heading</span></h1>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a>]</span> <span class="mw-headline" id="Level_2_Heading"> Level 2 Heading</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a>]</span> <span class="mw-headline" id="Level_3_Heading"> Level 3 Heading</span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a>]</span> <span class="mw-headline" id="Level_4_Heading"> Level 4 Heading</span></h4>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a>]</span> <span class="mw-headline" id="Level_5_Heading"> Level 5 Heading</span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a>]</span> <span class="mw-headline" id="Level_6_Heading"> Level 6 Heading</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a>]</span> <span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a>]</span> <span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span></h6>
-
-!! end
-
-!! test
-TOC regression (bug 9764)
-!! input
-== title 1 ==
-=== title 1.1 ===
-==== title 1.1.1 ====
-=== title 1.2 ===
-== title 2 ==
-=== title 2.1 ===
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a>
-<ul>
-<li class="toclevel-3 tocsection-3"><a href="#title_1.1.1"><span class="tocnumber">1.1.1</span> <span class="toctext">title 1.1.1</span></a></li>
-</ul>
-</li>
-<li class="toclevel-2 tocsection-4"><a href="#title_1.2"><span class="tocnumber">1.2</span> <span class="toctext">title 1.2</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-5"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-6"><a href="#title_2.1"><span class="tocnumber">2.1</span> <span class="toctext">title 2.1</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
-
-!! end
-
-!! test
-TOC with wgMaxTocLevel=3 (bug 6204)
-!! options
-wgMaxTocLevel=3
-!! input
-== title 1 ==
-=== title 1.1 ===
-==== title 1.1.1 ====
-=== title 1.2 ===
-== title 2 ==
-=== title 2.1 ===
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a></li>
-<li class="toclevel-2 tocsection-4"><a href="#title_1.2"><span class="tocnumber">1.2</span> <span class="toctext">title 1.2</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-5"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-6"><a href="#title_2.1"><span class="tocnumber">2.1</span> <span class="toctext">title 2.1</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
-
-!! end
-
-!! test
-TOC with wgMaxTocLevel=3 and two level four headings (bug 6204)
-!! options
-wgMaxTocLevel=3
-!! input
-==Section 1==
-===Section 1.1===
-====Section 1.1.1====
-====Section 1.1.1.1====
-==Section 2==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#Section_1.1"><span class="tocnumber">1.1</span> <span class="toctext">Section 1.1</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-5"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1">Section 1.1</span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span></h4>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 1.1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span></h4>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 2">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
-
-!! end
-
-
-!! test
-Resolving duplicate section names
-!! input
-== Foo bar ==
-== Foo bar ==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar_2"> Foo bar </span></h2>
-
-!! end
-
-!! test
-Resolving duplicate section names with differing case (bug 10721)
-!! input
-== Foo bar ==
-== Foo Bar ==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> Foo Bar </span></h2>
-
-!! end
-
-!! article
-Template:sections
-!! text
-===Section 1===
-==Section 2==
-!! endarticle
-
-!! test
-Template with sections, __NOTOC__
-!! input
-__NOTOC__
-==Section 0==
-{{sections}}
-==Section 4==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 0">edit</a>]</span> <span class="mw-headline" id="Section_0">Section 0</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a>]</span> <span class="mw-headline" id="Section_4">Section 4</span></h2>
-
-!! end
-
-!! test
-__NOEDITSECTION__ keyword
-!! input
-__NOEDITSECTION__
-==Section 1==
-==Section 2==
-!! result
-<h2> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-<h2> <span class="mw-headline" id="Section_2">Section 2</span></h2>
-
-!! end
-
-!! test
-Link inside a section heading
-!! input
-==Section with a [[Main Page|link]] in it==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section with a link in it">edit</a>]</span> <span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span></h2>
-
-!! end
-
-!! test
-TOC regression (bug 12077)
-!! input
-__TOC__
-== title 1 ==
-=== title 1.1 ===
-== title 2 ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-3"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-
-!! end
-
-!! test
-BUG 1219 URL next to image (good)
-!! input
-http://example.com [[Image:foobar.jpg]]
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!!end
-
-!! test
-Short headings with trailing space should match behaviour of Parser::doHeadings (bug 19910)
-!! input
-===
-The line above must have a trailing space!
-=== <!--
---> <!-- -->
-But just in case it doesn't...
-!! result
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D">=</span></h1>
-<p>The line above must have a trailing space!
-</p>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D_2">=</span></h1>
-<p>But just in case it doesn't...
-</p>
-!! end
-
-!! test
-Header with special characters (bug 25462)
-!! input
-The tooltips shall not show entities to the user (ie. be double escaped)
-
-== text > text ==
-section 1
-
-== text < text ==
-section 2
-
-== text & text ==
-section 3
-
-== text ' text ==
-section 4
-
-== text " text ==
-section 5
-!! result
-<p>The tooltips shall not show entities to the user (ie. be double escaped)
-</p>
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#text_.3E_text"><span class="tocnumber">1</span> <span class="toctext">text &gt; text</span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#text_.3C_text"><span class="tocnumber">2</span> <span class="toctext">text &lt; text</span></a></li>
-<li class="toclevel-1 tocsection-3"><a href="#text_.26_text"><span class="tocnumber">3</span> <span class="toctext">text &amp; text</span></a></li>
-<li class="toclevel-1 tocsection-4"><a href="#text_.27_text"><span class="tocnumber">4</span> <span class="toctext">text ' text</span></a></li>
-<li class="toclevel-1 tocsection-5"><a href="#text_.22_text"><span class="tocnumber">5</span> <span class="toctext">text " text</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: text > text">edit</a>]</span> <span class="mw-headline" id="text_.3E_text"> text &gt; text </span></h2>
-<p>section 1
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a>]</span> <span class="mw-headline" id="text_.3C_text"> text &lt; text </span></h2>
-<p>section 2
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a>]</span> <span class="mw-headline" id="text_.26_text"> text &amp; text </span></h2>
-<p>section 3
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a>]</span> <span class="mw-headline" id="text_.27_text"> text ' text </span></h2>
-<p>section 4
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a>]</span> <span class="mw-headline" id="text_.22_text"> text " text </span></h2>
-<p>section 5
-</p>
-!! end
-
-!! test
-Headers with excess '=' characters
-(Are similar tests necessary beyond the 1st level?)
-!! input
-=foo==
-==foo=
-=''italic'' heading==
-==''italic'' heading=
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#foo.3D"><span class="tocnumber">1</span> <span class="toctext">foo=</span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#.3Dfoo"><span class="tocnumber">2</span> <span class="toctext">=foo</span></a></li>
-<li class="toclevel-1 tocsection-3"><a href="#italic_heading.3D"><span class="tocnumber">3</span> <span class="toctext"><i>italic</i> heading=</span></a></li>
-<li class="toclevel-1 tocsection-4"><a href="#.3Ditalic_heading"><span class="tocnumber">4</span> <span class="toctext">=<i>italic</i> heading</span></a></li>
-</ul>
-</td></tr></table>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: foo=">edit</a>]</span> <span class="mw-headline" id="foo.3D">foo=</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =foo">edit</a>]</span> <span class="mw-headline" id=".3Dfoo">=foo</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: italic heading=">edit</a>]</span> <span class="mw-headline" id="italic_heading.3D"><i>italic</i> heading=</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: =italic heading">edit</a>]</span> <span class="mw-headline" id=".3Ditalic_heading">=<i>italic</i> heading</span></h1>
-
-!! end
-
-!! test
-BUG 1219 URL next to image (broken)
-!! input
-http://example.com[[Image:foobar.jpg]]
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!!end
-
-!! test
-Bug 1186 news: in the middle of text
-!! input
-http://en.wikinews.org/wiki/Wikinews:Workplace
-!! result
-<p><a rel="nofollow" class="external free" href="http://en.wikinews.org/wiki/Wikinews:Workplace">http://en.wikinews.org/wiki/Wikinews:Workplace</a>
-</p>
-!!end
-
-
-!! test
-Namespaced link must have a title
-!! input
-[[Project:]]
-!! result
-<p>[[Project:]]
-</p>
-!!end
-
-!! test
-Namespaced link must have a title (bad fragment version)
-!! input
-[[Project:#fragment]]
-!! result
-<p>[[Project:#fragment]]
-</p>
-!!end
-
-
-!! test
-div with no attributes
-!! input
-<div>HTML rocks</div>
-!! result
-<div>HTML rocks</div>
-
-!! end
-
-!! test
-div with double-quoted attribute
-!! input
-<div id="rock">HTML rocks</div>
-!! result
-<div id="rock">HTML rocks</div>
-
-!! end
-
-!! test
-div with single-quoted attribute
-!! input
-<div id='rock'>HTML rocks</div>
-!! result
-<div id="rock">HTML rocks</div>
-
-!! end
-
-!! test
-div with unquoted attribute
-!! input
-<div id=rock>HTML rocks</div>
-!! result
-<div id="rock">HTML rocks</div>
-
-!! end
-
-!! test
-div with illegal double attributes
-!! input
-<div id="a" id="b">HTML rocks</div>
-!! result
-<div id="b">HTML rocks</div>
-
-!!end
-
-!! test
-HTML multiple attributes correction
-!! input
-<p class="error" class="awesome">Awesome!</p>
-!! result
-<p class="awesome">Awesome!</p>
-
-!!end
-
-!! test
-Table multiple attributes correction
-!! input
-{|
-!+ class="error" class="awesome"| status
-|}
-!! result
-<table>
-<tr>
-<th class="awesome"> status
-</th></tr></table>
-
-!!end
-
-!! test
-DIV IN UPPERCASE
-!! input
-<DIV ID="x">HTML ROCKS</DIV>
-!! result
-<div id="x">HTML ROCKS</div>
-
-!!end
-
-
-!! test
-text with amp in the middle of nowhere
-!! input
-Remember AT&T?
-!!result
-<p>Remember AT&amp;T?
-</p>
-!! end
-
-!! test
-text with character entity: eacute
-!! input
-I always thought &eacute; was a cute letter.
-!! result
-<p>I always thought &#233; was a cute letter.
-</p>
-!! end
-
-!! test
-text with undefined character entity: xacute
-!! input
-I always thought &xacute; was a cute letter.
-!! result
-<p>I always thought &amp;xacute; was a cute letter.
-</p>
-!! end
-
-
-###
-### Media links
-###
-
-!! test
-Media link
-!! input
-[[Media:Foobar.jpg]]
-!! result
-<p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Media:Foobar.jpg</a>
-</p>
-!! end
-
-!! test
-Media link with text
-!! input
-[[Media:Foobar.jpg|A neat file to look at]]
-!! result
-<p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">A neat file to look at</a>
-</p>
-!! end
-
-# FIXME: this is still bad HTML tag nesting
-!! test
-Media link with nasty text
-fixme: doBlockLevels won't wrap this in a paragraph because it contains a div
-!! input
-[[Media:Foobar.jpg|Safe Link<div style=display:none>" onmouseover="alert(document.cookie)" onfoo="</div>]]
-!! result
-<a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Safe Link&lt;div style="display:none"&gt;" onmouseover="alert(document.cookie)" onfoo="&lt;/div&gt;</a>
-
-!! end
-
-!! test
-Media link to nonexistent file (bug 1702)
-!! input
-[[Media:No such.jpg]]
-!! result
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such.jpg" class="new" title="No such.jpg">Media:No such.jpg</a>
-</p>
-!! end
-
-!! test
-Image link to nonexistent file (bug 1850 - good)
-!! input
-[[Image:No such.jpg]]
-!! result
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such.jpg" class="new" title="File:No such.jpg">File:No such.jpg</a>
-</p>
-!! end
-
-!! test
-:Image link to nonexistent file (bug 1850 - bad)
-!! input
-[[:Image:No such.jpg]]
-!! result
-<p><a href="/index.php?title=File:No_such.jpg&amp;action=edit&amp;redlink=1" class="new" title="File:No such.jpg (page does not exist)">Image:No such.jpg</a>
-</p>
-!! end
-
-
-
-!! test
-Character reference normalization in link text (bug 1938)
-!! input
-[[Main Page|this&that]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">this&amp;that</a>
-</p>
-!!end
-
-!! article
-אַ
-!! text
-Test for unicode normalization
-
-The page's name is U+05d0 U+05b7, with non-canonical form U+FB2E
-!! endarticle
-
-!! test
-(bug 19451) Links should refer to the normalized form.
-!! input
-[[&#xFB2E;]]
-[[&#x5d0;&#x5b7;]]
-[[&#x5d0;ַ]]
-[[א&#x5b7;]]
-[[אַ]]
-!! result
-<p><a href="/wiki/%D7%90%D6%B7" title="אַ">&#xfb2e;</a>
-<a href="/wiki/%D7%90%D6%B7" title="אַ">&#x5d0;&#x5b7;</a>
-<a href="/wiki/%D7%90%D6%B7" title="אַ">&#x5d0;ַ</a>
-<a href="/wiki/%D7%90%D6%B7" title="אַ">א&#x5b7;</a>
-<a href="/wiki/%D7%90%D6%B7" title="אַ">אַ</a>
-</p>
-!! end
-
-!! test
-Empty attribute crash test (bug 2067)
-!! input
-<font color="">foo</font>
-!! result
-<p><font color="">foo</font>
-</p>
-!! end
-
-!! test
-Empty attribute crash test single-quotes (bug 2067)
-!! input
-<font color=''>foo</font>
-!! result
-<p><font color="">foo</font>
-</p>
-!! end
-
-!! test
-Attribute test: equals, then nothing
-!! input
-<font color=>foo</font>
-!! result
-<p><font>foo</font>
-</p>
-!! end
-
-!! test
-Attribute test: unquoted value
-!! input
-<font color=x>foo</font>
-!! result
-<p><font color="x">foo</font>
-</p>
-!! end
-
-!! test
-Attribute test: unquoted but illegal value (hash)
-!! input
-<font color=#x>foo</font>
-!! result
-<p><font color="#x">foo</font>
-</p>
-!! end
-
-!! test
-Attribute test: no value
-!! input
-<font color>foo</font>
-!! result
-<p><font color="color">foo</font>
-</p>
-!! end
-
-!! test
-Bug 2095: link with three closing brackets
-!! input
-[[Main Page]]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>]
-</p>
-!! end
-
-!! test
-Bug 2095: link with pipe and three closing brackets
-!! input
-[[Main Page|link]]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">link</a>]
-</p>
-!! end
-
-!! test
-Bug 2095: link with pipe and three closing brackets, version 2
-!! input
-[[Main Page|[http://example.com/]]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">[http://example.com/]</a>
-</p>
-!! end
-
-
-###
-### Safety
-###
-
-!! article
-Template:Dangerous attribute
-!! text
-" onmouseover="alert(document.cookie)
-!! endarticle
-
-!! article
-Template:Dangerous style attribute
-!! text
-border-size: expression(alert(document.cookie))
-!! endarticle
-
-!! article
-Template:Div style
-!! text
-<div style="float: right; {{{1}}}">Magic div</div>
-!! endarticle
-
-!! test
-Bug 2304: HTML attribute safety (safe template; regression bug 2309)
-!! input
-<div title="{{test}}"></div>
-!! result
-<div title="This is a test template"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (dangerous template; 2309)
-!! input
-<div title="{{dangerous attribute}}"></div>
-!! result
-<div title=""></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (dangerous style template; 2309)
-!! input
-<div style="{{dangerous style attribute}}"></div>
-!! result
-<div style="/* insecure input */"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (safe parameter; 2309)
-!! input
-{{div style|width: 200px}}
-!! result
-<div style="float: right; width: 200px">Magic div</div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (unsafe parameter; 2309)
-!! input
-{{div style|width: expression(alert(document.cookie))}}
-!! result
-<div style="/* insecure input */">Magic div</div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (unsafe breakout parameter; 2309)
-!! input
-{{div style|"><script>alert(document.cookie)</script>}}
-!! result
-<div style="float: right;">&lt;script&gt;alert(document.cookie)&lt;/script&gt;"&gt;Magic div</div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (unsafe breakout parameter 2; 2309)
-!! input
-{{div style|" ><script>alert(document.cookie)</script>}}
-!! result
-<div style="float: right;">&lt;script&gt;alert(document.cookie)&lt;/script&gt;"&gt;Magic div</div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (link)
-!! input
-<div title="[[Main Page]]"></div>
-!! result
-<div title="&#91;&#91;Main Page]]"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (italics)
-!! input
-<div title="''foobar''"></div>
-!! result
-<div title="&#39;&#39;foobar&#39;&#39;"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (bold)
-!! input
-<div title="'''foobar'''"></div>
-!! result
-<div title="&#39;&#39;&#39;foobar&#39;&#39;&#39;"></div>
-
-!! end
-
-
-!! test
-Bug 2304: HTML attribute safety (ISBN)
-!! input
-<div title="ISBN 1234567890"></div>
-!! result
-<div title="&#73;SBN 1234567890"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (RFC)
-!! input
-<div title="RFC 1234"></div>
-!! result
-<div title="&#82;FC 1234"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (PMID)
-!! input
-<div title="PMID 1234567890"></div>
-!! result
-<div title="&#80;MID 1234567890"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (web link)
-!! input
-<div title="http://example.com/"></div>
-!! result
-<div title="http&#58;//example.com/"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (named web link)
-!! input
-<div title="[http://example.com/ link]"></div>
-!! result
-<div title="&#91;http&#58;//example.com/ link]"></div>
-
-!! end
-
-!! test
-Bug 3244: HTML attribute safety (extension; safe)
-!! input
-<div style="<nowiki>background:blue</nowiki>"></div>
-!! result
-<div style="background:blue"></div>
-
-!! end
-
-!! test
-Bug 3244: HTML attribute safety (extension; unsafe)
-!! input
-<div style="<nowiki>border-left:expression(alert(document.cookie))</nowiki>"></div>
-!! result
-<div style="/* insecure input */"></div>
-
-!! end
-
-# More MSIE fun discovered by Tom Gilder
-
-!! test
-MSIE CSS safety test: spurious slash
-!! input
-<div style="background-image:u\rl(javascript:alert('boo'))">evil</div>
-!! result
-<div style="/* insecure input */">evil</div>
-
-!! end
-
-!! test
-MSIE CSS safety test: hex code
-!! input
-<div style="background-image:u\72l(javascript:alert('boo'))">evil</div>
-!! result
-<div style="/* insecure input */">evil</div>
-
-!! end
-
-!! test
-MSIE CSS safety test: comment in url
-!! input
-<div style="background-image:u/**/rl(javascript:alert('boo'))">evil</div>
-!! result
-<div style="background-image:u rl(javascript:alert(&#39;boo&#39;))">evil</div>
-
-!! end
-
-!! test
-MSIE CSS safety test: comment in expression
-!! input
-<div style="background-image:expres/**/sion(alert('boo4'))">evil4</div>
-!! result
-<div style="background-image:expres sion(alert(&#39;boo4&#39;))">evil4</div>
-
-!! end
-
-
-!! test
-Table attribute legitimate extension
-!! input
-{|
-!+ style="<nowiki>color:blue</nowiki>"| status
-|}
-!! result
-<table>
-<tr>
-<th style="color:blue"> status
-</th></tr></table>
-
-!!end
-
-!! test
-Table attribute safety
-!! input
-{|
-!+ style="<nowiki>border-width:expression(0+alert(document.cookie))</nowiki>"| status
-|}
-!! result
-<table>
-<tr>
-<th style="/* insecure input */"> status
-</th></tr></table>
-
-!! end
-
-!! test
-CSS line continuation 1
-!! input
-<div style="background-image: u\&#10;rl(test.jpg);"></div>
-!! result
-<div style="/* insecure input */"></div>
-
-!! end
-
-!! test
-CSS line continuation 2
-!! input
-<div style="background-image: u\&#13;rl(test.jpg); "></div>
-!! result
-<div style="/* insecure input */"></div>
-
-!! end
-
-!! article
-Template:Identity
-!! text
-{{{1}}}
-!! endarticle
-
-!! test
-Expansion of multi-line templates in attribute values (bug 6255)
-!! input
-<div style="background: {{identity|#00FF00}}">-</div>
-!! result
-<div style="background: #00FF00">-</div>
-
-!! end
-
-
-!! test
-Expansion of multi-line templates in attribute values (bug 6255 sanity check)
-!! input
-<div style="background:
-#00FF00">-</div>
-!! result
-<div style="background: #00FF00">-</div>
-
-!! end
-
-!! test
-Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
-!! input
-<div style="background: &#10;#00FF00">-</div>
-!! result
-<div style="background: &#10;#00FF00">-</div>
-
-!! end
-
-###
-### Parser hooks (see maintenance/parserTestsParserHook.php for the <tag> extension)
-###
-!! test
-Parser hook: empty input
-!! input
-<tag></tag>
-!! result
-<pre>
-string(0) ""
-array(0) {
-}
-</pre>
-
-!! end
-
-!! test
-Parser hook: empty input using terminated empty elements
-!! input
-<tag/>
-!! result
-<pre>
-NULL
-array(0) {
-}
-</pre>
-
-!! end
-
-!! test
-Parser hook: empty input using terminated empty elements (space before)
-!! input
-<tag />
-!! result
-<pre>
-NULL
-array(0) {
-}
-</pre>
-
-!! end
-
-!! test
-Parser hook: basic input
-!! input
-<tag>input</tag>
-!! result
-<pre>
-string(5) "input"
-array(0) {
-}
-</pre>
-
-!! end
-
-
-!! test
-Parser hook: case insensitive
-!! input
-<TAG>input</TAG>
-!! result
-<pre>
-string(5) "input"
-array(0) {
-}
-</pre>
-
-!! end
-
-
-!! test
-Parser hook: case insensitive, redux
-!! input
-<TaG>input</TAg>
-!! result
-<pre>
-string(5) "input"
-array(0) {
-}
-</pre>
-
-!! end
-
-!! test
-Parser hook: nested tags
-!! options
-noxml
-!! input
-<tag><tag></tag></tag>
-!! result
-<pre>
-string(5) "<tag>"
-array(0) {
-}
-</pre>&lt;/tag&gt;
-
-!! end
-
-!! test
-Parser hook: basic arguments
-!! input
-<tag width=200 height = "100" depth = '50' square></tag>
-!! result
-<pre>
-string(0) ""
-array(4) {
- ["width"]=>
- string(3) "200"
- ["height"]=>
- string(3) "100"
- ["depth"]=>
- string(2) "50"
- ["square"]=>
- string(6) "square"
-}
-</pre>
-
-!! end
-
-!! test
-Parser hook: argument containing a forward slash (bug 5344)
-!! input
-<tag filename='/tmp/bla'></tag>
-!! result
-<pre>
-string(0) ""
-array(1) {
- ["filename"]=>
- string(8) "/tmp/bla"
-}
-</pre>
-
-!! end
-
-!! test
-Parser hook: empty input using terminated empty elements (bug 2374)
-!! input
-<tag foo=bar/>text
-!! result
-<pre>
-NULL
-array(1) {
- ["foo"]=>
- string(3) "bar"
-}
-</pre>text
-
-!! end
-
-# </tag> should be output literally since there is no matching tag that begins it
-!! test
-Parser hook: basic arguments using terminated empty elements (bug 2374)
-!! input
-<tag width=200 height = "100" depth = '50' square/>
-other stuff
-</tag>
-!! result
-<pre>
-NULL
-array(4) {
- ["width"]=>
- string(3) "200"
- ["height"]=>
- string(3) "100"
- ["depth"]=>
- string(2) "50"
- ["square"]=>
- string(6) "square"
-}
-</pre>
-<p>other stuff
-&lt;/tag&gt;
-</p>
-!! end
-
-###
-### (see maintenance/parserTestsStaticParserHook.php for the <statictag> extension)
-###
-
-!! test
-Parser hook: static parser hook not inside a comment
-!! input
-<statictag>hello, world</statictag>
-<statictag action=flush/>
-!! result
-<p>hello, world
-</p>
-!! end
-
-
-!! test
-Parser hook: static parser hook inside a comment
-!! input
-<!-- <statictag>hello, world</statictag> -->
-<statictag action=flush/>
-!! result
-<p><br />
-</p>
-!! end
-
-# Nested template calls; this case was broken by Parser.php rev 1.506,
-# since reverted.
-
-!! article
-Template:One-parameter
-!! text
-(My parameter is: {{{1}}})
-!! endarticle
-
-!! article
-Template:Map-one-parameter
-!! text
-{{{{{1}}}|{{{2}}}}}
-!! endarticle
-
-!! test
-Nested template calls
-!! input
-{{Map-one-parameter|One-parameter|param}}
-!! result
-<p>(My parameter is: param)
-</p>
-!! end
-
-
-###
-### Sanitizer
-###
-!! test
-Sanitizer: Closing of open tags
-!! input
-<s></s><table></table>
-!! result
-<s></s><table></table>
-
-!! end
-
-!! test
-Sanitizer: Closing of open but not closed tags
-!! input
-<s>foo
-!! result
-<p><s>foo</s>
-</p>
-!! end
-
-!! test
-Sanitizer: Closing of closed but not open tags
-!! input
-</s>
-!! result
-<p>&lt;/s&gt;
-</p>
-!! end
-
-!! test
-Sanitizer: Closing of closed but not open table tags
-!! input
-Table not started</td></tr></table>
-!! result
-<p>Table not started&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
-</p>
-!! end
-
-!! test
-Sanitizer: Escaping of spaces, multibyte characters, colons & other stuff in id=""
-!! input
-<span id="æ: v">byte</span>[[#æ: v|backlink]]
-!! result
-<p><span id=".C3.A6:_v">byte</span><a href="#.C3.A6:_v">backlink</a>
-</p>
-!! end
-
-!! test
-Sanitizer: Validating the contents of the id attribute (bug 4515)
-!! options
-disabled
-!! input
-<br id=9 />
-!! result
-Something, but definitely not <br id="9" />...
-!! end
-
-!! test
-Sanitizer: Validating id attribute uniqueness (bug 4515, bug 6301)
-!! options
-disabled
-!! input
-<br id="foo" /><br id="foo" />
-!! result
-Something need to be done. foo-2 ?
-!! end
-
-!! test
-Language converter: output gets cut off unexpectedly (bug 5757)
-!! options
-language=zh
-!! input
-this bit is safe: }-
-
-but if we add a conversion instance: -{zh-cn:xxx;zh-tw:yyy}-
-
-then we get cut off here: }-
-
-all additional text is vanished
-!! result
-<p>this bit is safe: }-
-</p><p>but if we add a conversion instance: xxx
-</p><p>then we get cut off here: }-
-</p><p>all additional text is vanished
-</p>
-!! end
-
-!! test
-Self closed html pairs (bug 5487)
-!! options
-!! input
-<center><font id="bug" />Centered text</center>
-<div><font id="bug2" />In div text</div>
-!! result
-<center>&lt;font id="bug" /&gt;Centered text</center>
-<div>&lt;font id="bug2" /&gt;In div text</div>
-
-!! end
-
-#
-#
-#
-
-!! test
-Punctuation: nbsp before exclamation
-!! input
-C'est grave !
-!! result
-<p>C'est grave&#160;!
-</p>
-!! end
-
-!! test
-Punctuation: CSS !important (bug 11874)
-!! input
-<div style="width:50% !important">important</div>
-!! result
-<div style="width:50% !important">important</div>
-
-!!end
-
-!! test
-Punctuation: CSS ! important (bug 11874; with space after)
-!! input
-<div style="width:50% ! important">important</div>
-!! result
-<div style="width:50% ! important">important</div>
-
-!!end
-
-
-!! test
-HTML bullet list, closed tags (bug 5497)
-!! input
-<ul>
-<li>One</li>
-<li>Two</li>
-</ul>
-!! result
-<ul>
-<li>One</li>
-<li>Two</li>
-</ul>
-
-!! end
-
-!! test
-HTML bullet list, unclosed tags (bug 5497)
-!! options
-disabled
-!! input
-<ul>
-<li>One
-<li>Two
-</ul>
-!! result
-<ul>
-<li>One
-</li><li>Two
-</li></ul>
-
-!! end
-
-!! test
-HTML ordered list, closed tags (bug 5497)
-!! input
-<ol>
-<li>One</li>
-<li>Two</li>
-</ol>
-!! result
-<ol>
-<li>One</li>
-<li>Two</li>
-</ol>
-
-!! end
-
-!! test
-HTML ordered list, unclosed tags (bug 5497)
-!! options
-disabled
-!! input
-<ol>
-<li>One
-<li>Two
-</ol>
-!! result
-<ol>
-<li>One
-</li><li>Two
-</li></ol>
-
-!! end
-
-!! test
-HTML nested bullet list, closed tags (bug 5497)
-!! input
-<ul>
-<li>One</li>
-<li>Two:
-<ul>
-<li>Sub-one</li>
-<li>Sub-two</li>
-</ul>
-</li>
-</ul>
-!! result
-<ul>
-<li>One</li>
-<li>Two:
-<ul>
-<li>Sub-one</li>
-<li>Sub-two</li>
-</ul>
-</li>
-</ul>
-
-!! end
-
-!! test
-HTML nested bullet list, open tags (bug 5497)
-!! options
-disabled
-!! input
-<ul>
-<li>One
-<li>Two:
-<ul>
-<li>Sub-one
-<li>Sub-two
-</ul>
-</ul>
-!! result
-<ul>
-<li>One
-</li><li>Two:
-<ul>
-<li>Sub-one
-</li><li>Sub-two
-</li></ul>
-</li></ul>
-
-!! end
-
-!! test
-HTML nested ordered list, closed tags (bug 5497)
-!! input
-<ol>
-<li>One</li>
-<li>Two:
-<ol>
-<li>Sub-one</li>
-<li>Sub-two</li>
-</ol>
-</li>
-</ol>
-!! result
-<ol>
-<li>One</li>
-<li>Two:
-<ol>
-<li>Sub-one</li>
-<li>Sub-two</li>
-</ol>
-</li>
-</ol>
-
-!! end
-
-!! test
-HTML nested ordered list, open tags (bug 5497)
-!! options
-disabled
-!! input
-<ol>
-<li>One
-<li>Two:
-<ol>
-<li>Sub-one
-<li>Sub-two
-</ol>
-</ol>
-!! result
-<ol>
-<li>One
-</li><li>Two:
-<ol>
-<li>Sub-one
-</li><li>Sub-two
-</li></ol>
-</li></ol>
-
-!! end
-
-!! test
-HTML ordered list item with parameters oddity
-!! input
-<ol><li id="fragment">One</li></ol>
-!! result
-<ol><li id="fragment">One</li></ol>
-
-!! end
-
-!!test
-bug 5918: autonumbering
-!! input
-[http://first/] [http://second] [ftp://ftp]
-
-ftp://inlineftp
-
-[mailto:enclosed@mail.tld With target]
-
-[mailto:enclosed@mail.tld]
-
-mailto:inline@mail.tld
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://first/">[1]</a> <a rel="nofollow" class="external autonumber" href="http://second">[2]</a> <a rel="nofollow" class="external autonumber" href="ftp://ftp">[3]</a>
-</p><p><a rel="nofollow" class="external free" href="ftp://inlineftp">ftp://inlineftp</a>
-</p><p><a rel="nofollow" class="external text" href="mailto:enclosed@mail.tld">With target</a>
-</p><p><a rel="nofollow" class="external autonumber" href="mailto:enclosed@mail.tld">[4]</a>
-</p><p><a rel="nofollow" class="external free" href="mailto:inline@mail.tld">mailto:inline@mail.tld</a>
-</p>
-!! end
-
-
-#
-# Security and HTML correctness
-# From Nick Jenkins' fuzz testing
-#
-
-!! test
-Fuzz testing: Parser13
-!! input
-{|
-| http://a|
-!! result
-<table>
-<tr>
-<td>
-</td>
-</tr>
-</table>
-
-!! end
-
-!! test
-Fuzz testing: Parser14
-!! input
-== onmouseover= ==
-http://__TOC__
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a>]</span> <span class="mw-headline" id="onmouseover.3D"> onmouseover= </span></h2>
-http://<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
-</ul>
-</td></tr></table>
-
-!! end
-
-!! test
-Fuzz testing: Parser14-table
-!! input
-==a==
-{| STYLE=__TOC__
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: a">edit</a>]</span> <span class="mw-headline" id="a">a</span></h2>
-<table style="&#95;_TOC&#95;_">
-<tr><td></td></tr>
-</table>
-
-!! end
-
-# Known to produce bogus xml (extra </td>)
-!! test
-Fuzz testing: Parser16
-!! options
-noxml
-!! input
-{|
-!https://||||||
-!! result
-<table>
-<tr>
-<th>https://</th>
-<th></th>
-<th></th>
-<th>
-</td>
-</tr>
-</table>
-
-!! end
-
-!! test
-Fuzz testing: Parser21
-!! input
-{|
-! irc://{{ftp://a" onmouseover="alert('hello world');"
-|
-!! result
-<table>
-<tr>
-<th> <a rel="nofollow" class="external free" href="irc://{{ftp://a">irc://{{ftp://a</a>" onmouseover="alert('hello world');"
-</th>
-<td>
-</td>
-</tr>
-</table>
-
-!! end
-
-!! test
-Fuzz testing: Parser22
-!! input
-http://===r:::https://b
-
-{|
-!!result
-<p><a rel="nofollow" class="external free" href="http://===r:::https://b">http://===r:::https://b</a>
-</p>
-<table>
-<tr><td></td></tr>
-</table>
-
-!! end
-
-# Known to produce bad XML for now
-!! test
-Fuzz testing: Parser24
-!! options
-noxml
-!! input
-{|
-{{{|
-<u CLASS=
-| {{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}} >
-<br style="onmouseover='alert(document.cookie);' " />
-
-MOVE YOUR MOUSE CURSOR OVER THIS TEXT
-|
-!! result
-<table>
-{{{|
-<u class="&#124;">}}}} &gt;
-<br style="onmouseover=&#39;alert(document.cookie);&#39;" />
-
-MOVE YOUR MOUSE CURSOR OVER THIS TEXT
-<tr>
-<td></u>
-</td>
-</tr>
-</table>
-
-!! end
-
-# Note: the current result listed for this is not what the original one was,
-# but the original bug was JavaScript injection, which is fixed in any case.
-# It's not clear that the original result listed was any more correct than the
-# current one. Original result:
-# <p>{{{|
-# </p>
-# <li class="&#124;&#124;">
-# }}}blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
-!!test
-Fuzz testing: Parser25 (bug 6055)
-!! input
-{{{
-|
-<LI CLASS=||
- >
-}}}blah" onmouseover="alert('hello world');" align="left"'''MOVE MOUSE CURSOR OVER HERE
-!! result
-<p>&lt;LI CLASS=blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
-</p>
-!! end
-
-!!test
-Fuzz testing: URL adjacent extension (with space, clean)
-!! options
-!! input
-http://example.com <nowiki>junk</nowiki>
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> junk
-</p>
-!!end
-
-!!test
-Fuzz testing: URL adjacent extension (no space, dirty; nowiki)
-!! options
-!! input
-http://example.com<nowiki>junk</nowiki>
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>junk
-</p>
-!!end
-
-!!test
-Fuzz testing: URL adjacent extension (no space, dirty; pre)
-!! options
-!! input
-http://example.com<pre>junk</pre>
-!! result
-<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><pre>junk</pre>
-
-!!end
-
-!!test
-Fuzz testing: image with bogus manual thumbnail
-!!input
-[[Image:foobar.jpg|thumbnail= ]]
-!!result
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;">Error creating thumbnail: <div class="thumbcaption"></div></div></div>
-
-!!end
-
-!! test
-Fuzz testing: encoded newline in generated HTML replacements (bug 6577)
-!! input
-<pre dir="&#10;"></pre>
-!! result
-<pre dir="&#10;"></pre>
-
-!! end
-
-!! test
-Parsing optional HTML elements (Bug 6171)
-!! options
-!! input
-<table>
- <tr>
- <td> Some tabular data</td>
- <td> More tabular data ...
- <td> And yet som tabular data</td>
- </tr>
-</table>
-!! result
-<table>
- <tr>
- <td> Some tabular data</td>
- <td> More tabular data ...
- </td><td> And yet som tabular data</td>
- </tr>
-</table>
-
-!! end
-
-!! test
-Correct handling of <td>, <tr> (Bug 6171)
-!! options
-!! input
-<table>
- <tr>
- <td> Some tabular data</td>
- <td> More tabular data ...</td>
- <td> And yet som tabular data</td>
- </tr>
-</table>
-!! result
-<table>
- <tr>
- <td> Some tabular data</td>
- <td> More tabular data ...</td>
- <td> And yet som tabular data</td>
- </tr>
-</table>
-
-!! end
-
-
-!! test
-Parsing crashing regression (fr:JavaScript)
-!! input
-</body></x>
-!! result
-<p>&lt;/body&gt;&lt;/x&gt;
-</p>
-!! end
-
-!! test
-Inline wiki vs wiki block nesting
-!! input
-'''Bold paragraph
-
-New wiki paragraph
-!! result
-<p><b>Bold paragraph</b>
-</p><p>New wiki paragraph
-</p>
-!! end
-
-!! test
-Inline HTML vs wiki block nesting
-!! options
-disabled
-!! input
-<b>Bold paragraph
-
-New wiki paragraph
-!! result
-<p><b>Bold paragraph</b>
-</p><p>New wiki paragraph
-</p>
-!! end
-
-# Original result was this:
-# <p><b>bold</b><b>bold<i>bolditalics</i></b>
-# </p>
-# While that might be marginally more intuitive, maybe, the six-apostrophe
-# construct is clearly pathological and the result stated here (which is what
-# the parser actually does) is about as reasonable as anything.
-!!test
-Mixing markup for italics and bold
-!! options
-!! input
-'''bold''''''bold''bolditalics'''''
-!! result
-<p>'<i>bold'</i><b>bold<i>bolditalics</i></b>
-</p>
-!! end
-
-
-!! article
-Xyzzyx
-!! text
-Article for special page transclusion test
-!! endarticle
-
-!! test
-Special page transclusion
-!! options
-!! input
-{{Special:Prefixindex/Xyzzyx}}
-!! result
-<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
-
-!! end
-
-!! test
-Special page transclusion twice (bug 5021)
-!! options
-!! input
-{{Special:Prefixindex/Xyzzyx}}
-{{Special:Prefixindex/Xyzzyx}}
-!! result
-<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
-<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
-
-!! end
-
-!! test
-Transclusion of default MediaWiki message
-!! input
-{{MediaWiki:Mainpage}}
-!!result
-<p>Main Page
-</p>
-!! end
-
-!! test
-Transclusion of nonexistent MediaWiki message
-!! input
-{{MediaWiki:Mainpagexxx}}
-!!result
-<p><a href="/index.php?title=MediaWiki:Mainpagexxx&amp;action=edit&amp;redlink=1" class="new" title="MediaWiki:Mainpagexxx (page does not exist)">MediaWiki:Mainpagexxx</a>
-</p>
-!! end
-
-!! test
-Transclusion of MediaWiki message with underscore
-!! input
-{{MediaWiki:history_short}}
-!! result
-<p>History
-</p>
-!! end
-
-!! test
-Transclusion of MediaWiki message with space
-!! input
-{{MediaWiki:history short}}
-!! result
-<p>History
-</p>
-!! end
-
-!! test
-Invalid header with following text
-!! input
-= x = y
-!! result
-<p>= x = y
-</p>
-!! end
-
-
-!! test
-Section extraction test (section 0)
-!! options
-section=0
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-!! end
-
-!! test
-Section extraction test (section 1)
-!! options
-section=1
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-==a==
-===aa===
-====aaa====
-!! end
-
-!! test
-Section extraction test (section 2)
-!! options
-section=2
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-===aa===
-====aaa====
-!! end
-
-!! test
-Section extraction test (section 3)
-!! options
-section=3
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-====aaa====
-!! end
-
-!! test
-Section extraction test (section 4)
-!! options
-section=4
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-!! end
-
-!! test
-Section extraction test (section 5)
-!! options
-section=5
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-===ba===
-!! end
-
-!! test
-Section extraction test (section 6)
-!! options
-section=6
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-===bb===
-====bba====
-!! end
-
-!! test
-Section extraction test (section 7)
-!! options
-section=7
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-====bba====
-!! end
-
-!! test
-Section extraction test (section 8)
-!! options
-section=8
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-===bc===
-!! end
-
-!! test
-Section extraction test (section 9)
-!! options
-section=9
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-==c==
-===ca===
-!! end
-
-!! test
-Section extraction test (section 10)
-!! options
-section=10
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-===ca===
-!! end
-
-!! test
-Section extraction test (nonexistent section 11)
-!! options
-section=11
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-!! end
-
-!! test
-Section extraction test with bogus heading (section 1)
-!! options
-section=1
-!! input
-==a==
-==bogus== not a legal section
-==b==
-!! result
-==a==
-==bogus== not a legal section
-!! end
-
-!! test
-Section extraction test with bogus heading (section 2)
-!! options
-section=2
-!! input
-==a==
-==bogus== not a legal section
-==b==
-!! result
-==b==
-!! end
-
-!! test
-Section extraction test with comment after heading (section 1)
-!! options
-section=1
-!! input
-==a==
-==b== <!-- -->
-==c==
-!! result
-==a==
-!! end
-
-!! test
-Section extraction test with comment after heading (section 2)
-!! options
-section=2
-!! input
-==a==
-==b== <!-- -->
-==c==
-!! result
-==b== <!-- -->
-!! end
-
-!! test
-Section extraction test with bogus <nowiki> heading (section 1)
-!! options
-section=1
-!! input
-==a==
-==bogus== <nowiki>not a legal section</nowiki>
-==b==
-!! result
-==a==
-==bogus== <nowiki>not a legal section</nowiki>
-!! end
-
-!! test
-Section extraction test with bogus <nowiki> heading (section 2)
-!! options
-section=2
-!! input
-==a==
-==bogus== <nowiki>not a legal section</nowiki>
-==b==
-!! result
-==b==
-!! end
-
-
-# Formerly testing for bug 2587, now resolved by the use of unmarked sections
-# instead of respecting commented sections
-!! test
-Section extraction prefixed by comment (section 1)
-!! options
-section=1
-!! input
-<!-- -->==sec1==
-==sec2==
-!!result
-==sec2==
-!!end
-
-!! test
-Section extraction prefixed by comment (section 2)
-!! options
-section=2
-!! input
-<!-- -->==sec1==
-==sec2==
-!!result
-
-!!end
-
-
-# Formerly testing for bug 2607, now resolved by the use of unmarked sections
-# instead of respecting HTML-style headings
-!! test
-Section extraction, mixed wiki and html (section 1)
-!! options
-section=1
-!! input
-<h2>unmarked</h2>
-unmarked
-==1==
-one
-==2==
-two
-!! result
-==1==
-one
-!! end
-
-!! test
-Section extraction, mixed wiki and html (section 2)
-!! options
-section=2
-!! input
-<h2>unmarked</h2>
-unmarked
-==1==
-one
-==2==
-two
-!! result
-==2==
-two
-!! end
-
-
-# Formerly testing for bug 3342
-!! test
-Section extraction, heading surrounded by <noinclude>
-!! options
-section=1
-!! input
-<noinclude>==unmarked==</noinclude>
-==marked==
-!! result
-==marked==
-!!end
-
-# Test behaviour of bug 19910
-!! test
-Sectiion with all-equals
-!! options
-section=2
-!! input
-===
-The line above must have a trailing space
-=== <!--
---> <!-- -->
-But just in case it doesn't...
-!! result
-=== <!--
---> <!-- -->
-But just in case it doesn't...
-!! end
-
-!! test
-Section replacement test (section 0)
-!! options
-replace=0,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-xxx
-
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 1)
-!! options
-replace=1,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-xxx
-
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 2)
-!! options
-replace=2,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-xxx
-
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 3)
-!! options
-replace=3,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-xxx
-
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 4)
-!! options
-replace=4,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-xxx
-
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 5)
-!! options
-replace=5,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-xxx
-
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 6)
-!! options
-replace=6,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-xxx
-
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 7)
-!! options
-replace=7,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-xxx
-
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 8)
-!! options
-replace=8,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-xxx
-
-==c==
-===ca===
-!!end
-
-!! test
-Section replacement test (section 9)
-!! options
-replace=9,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-xxx
-!! end
-
-!! test
-Section replacement test (section 10)
-!! options
-replace=10,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-xxx
-!! end
-
-!! test
-Section replacement test with initial whitespace (bug 13728)
-!! options
-replace=2,"xxx"
-!! input
- Preformatted initial line
-==a==
-===a===
-!! result
- Preformatted initial line
-==a==
-xxx
-!! end
-
-
-!! test
-Section extraction, heading followed by pre with 20 spaces (bug 6398)
-!! options
-section=1
-!! input
-==a==
- a
-!! result
-==a==
- a
-!! end
-
-!! test
-Section extraction, heading followed by pre with 19 spaces (bug 6398 sanity check)
-!! options
-section=1
-!! input
-==a==
- a
-!! result
-==a==
- a
-!! end
-
-
-!! test
-Section extraction, <pre> around bogus header (bug 10309)
-!! options
-noxml section=2
-!! input
-== Section One ==
-<pre>
-=======
-</pre>
-
-== Section Two ==
-stuff
-!! result
-== Section Two ==
-stuff
-!! end
-
-!! test
-Section replacement, <pre> around bogus header (bug 10309)
-!! options
-noxml replace=2,"xxx"
-!! input
-== Section One ==
-<pre>
-=======
-</pre>
-
-== Section Two ==
-stuff
-!! result
-== Section One ==
-<pre>
-=======
-</pre>
-
-xxx
-!! end
-
-
-
-!! test
-Handling of &#x0A; in URLs
-!! input
-**irc://&#x0A;a
-!! result
-<ul><li><ul><li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
-</li></ul>
-</li></ul>
-
-!!end
-
-!! test
-5 quotes, code coverage +1 line
-!! input
-'''''
-!! result
-!! end
-
-!! test
-Special:Search page linking.
-!! input
-{{Special:search}}
-!! result
-<p><a href="/wiki/Special:Search" title="Special:Search">Special:Search</a>
-</p>
-!! end
-
-!! test
-Say the magic word
-!! input
-* {{PAGENAME}}
-* {{BASEPAGENAME}}
-* {{SUBPAGENAME}}
-* {{SUBPAGENAMEE}}
-* {{BASEPAGENAME}}
-* {{BASEPAGENAMEE}}
-* {{TALKPAGENAME}}
-* {{TALKPAGENAMEE}}
-* {{SUBJECTPAGENAME}}
-* {{SUBJECTPAGENAMEE}}
-* {{NAMESPACEE}}
-* {{NAMESPACE}}
-* {{TALKSPACE}}
-* {{TALKSPACEE}}
-* {{SUBJECTSPACE}}
-* {{SUBJECTSPACEE}}
-* {{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
-!! result
-<ul><li> Parser test
-</li><li> Parser test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Talk:Parser test
-</li><li> Talk:Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li>
-</li><li>
-</li><li> Talk
-</li><li> Talk
-</li><li>
-</li><li>
-</li><li> <a href="/index.php?title=Template:Dynamic&amp;action=edit&amp;redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a>
-</li></ul>
-
-!! end
-### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
-
-!! test
-Gallery
-!! input
-<gallery>
-image1.png |
-image2.gif|||||
-
-image3|
-image4 |300px| centre
- image5.svg| http://///////
-[[x|xx]]]]
-* image6
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image1.png</div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image2.gif</div>
- <div class="gallerytext">
-<p>||||
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image3</div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image4</div>
- <div class="gallerytext">
-<p>300px| centre
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image5.svg</div>
- <div class="gallerytext">
-<p><a rel="nofollow" class="external free" href="http://///////">http://///////</a>
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">* image6</div>
- <div class="gallerytext">
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!! test
-Gallery (with options)
-!! input
-<gallery widths='70px' heights='40px' perrow='2' caption='Foo [[Main Page]]' >
-File:Nonexistant.jpg|caption
-File:Nonexistant.jpg
-image:foobar.jpg|some '''caption''' [[Main Page]]
-image:foobar.jpg
-image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
-</gallery>
-!! result
-<ul class="gallery" style="max-width: 226px;_width: 226px;">
- <li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
- <li class="gallerybox" style="width: 105px"><div style="width: 105px">
- <div style="height: 70px;">Nonexistant.jpg</div>
- <div class="gallerytext">
-<p>caption
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 105px"><div style="width: 105px">
- <div style="height: 70px;">Nonexistant.jpg</div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 105px"><div style="width: 105px">
- <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="70" height="8" /></a></div></div>
- <div class="gallerytext">
-<p>some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 105px"><div style="width: 105px">
- <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="70" height="8" /></a></div></div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 105px"><div style="width: 105px">
- <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="This is a foo-bar." src="http://example.com/images/3/3a/Foobar.jpg" width="70" height="8" /></a></div></div>
- <div class="gallerytext">
-<p>Blabla|blabla.
-</p>
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!! test
-Gallery with wikitext inside caption
-!! input
-<gallery>
-File:foobar.jpg|[[File:foobar.jpg|20px|desc|alt=inneralt]]|alt=galleryalt
-File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="desc"><img alt="inneralt" src="http://example.com/images/3/3a/Foobar.jpg" width="20" height="2" /></a>
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p>This is a test template
-</p>
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!! test
-gallery (with showfilename option)
-!! input
-<gallery showfilename>
-File:Nonexistant.jpg|caption
-File:Nonexistant.jpg
-image:foobar.jpg|some '''caption''' [[Main Page]]
-File:Foobar.jpg
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Nonexistant.jpg</div>
- <div class="gallerytext">
-<p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
-caption
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Nonexistant.jpg</div>
- <div class="gallerytext">
-<p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
-some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
-</p>
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!! test
-Gallery (with namespace-less filenames)
-!! input
-<gallery>
-File:Nonexistant.jpg
-Nonexistant.jpg
-image:foobar.jpg
-foobar.jpg
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Nonexistant.jpg</div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Nonexistant.jpg</div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!! test
-HTML Hex character encoding (spells the word "JavaScript")
-!! input
-&#x4A;&#x061;&#x0076;&#x00061;&#x000053;&#x0000063;&#114;&#x0000069;&#00000112;&#x0000000074;
-!! result
-<p>&#x4a;&#x61;&#x76;&#x61;&#x53;&#x63;&#114;&#x69;&#112;&#x74;
-</p>
-!! end
-
-!! test
-HTML Hex character encoding bogus encoding (bug 26437 regression check)
-!! input
-&#xsee;&#XSEE;
-!! result
-<p>&amp;#xsee;&amp;#XSEE;
-</p>
-!! end
-
-!! test
-HTML Hex character encoding mixed case
-!! input
-&#xEE;&#Xee;
-!! result
-<p>&#xee;&#xee;
-</p>
-!! end
-
-!! test
-__FORCETOC__ override
-!! input
-__NEWSECTIONLINK__
-__FORCETOC__
-!! result
-<p><br />
-</p>
-!! end
-
-!! test
-ISBN code coverage
-!! input
-ISBN 978-0-1234-56&#x20;789
-!! result
-<p><a href="/wiki/Special:BookSources/9780123456" class="internal mw-magiclink-isbn">ISBN 978-0-1234-56</a>&#x20;789
-</p>
-!! end
-
-!! test
-ISBN followed by 5 spaces
-!! input
-ISBN
-!! result
-<p>ISBN
-</p>
-!! end
-
-!! test
-Double ISBN
-!! input
-ISBN ISBN 1234567890
-!! result
-<p>ISBN <a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
-</p>
-!! end
-
-!! test
-Bug 22905: <abbr> followed by ISBN followed by </a>
-!! input
-<abbr>(fr)</abbr> ISBN 2753300917 [http://www.example.com example.com]
-!! result
-<p><abbr>(fr)</abbr> <a href="/wiki/Special:BookSources/2753300917" class="internal mw-magiclink-isbn">ISBN 2753300917</a> <a rel="nofollow" class="external text" href="http://www.example.com">example.com</a>
-</p>
-!! end
-
-!! test
-Double RFC
-!! input
-RFC RFC 1234
-!! result
-<p>RFC <a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc1234">RFC 1234</a>
-</p>
-!! end
-
-!! test
-Double RFC with a wiki link
-!! input
-RFC [[RFC 1234]]
-!! result
-<p>RFC <a href="/index.php?title=RFC_1234&amp;action=edit&amp;redlink=1" class="new" title="RFC 1234 (page does not exist)">RFC 1234</a>
-</p>
-!! end
-
-!! test
-RFC code coverage
-!! input
-RFC 983&#x20;987
-!! result
-<p><a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc983">RFC 983</a>&#x20;987
-</p>
-!! end
-
-!! test
-Centre-aligned image
-!! input
-[[Image:foobar.jpg|centre]]
-!! result
-<div class="center"><div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div></div>
-
-!!end
-
-!! test
-None-aligned image
-!! input
-[[Image:foobar.jpg|none]]
-!! result
-<div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-
-!!end
-
-!! test
-Width + Height sized image (using px) (height is ignored)
-!! input
-[[Image:foobar.jpg|640x480px]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="640" height="73" /></a>
-</p>
-!!end
-
-!! test
-Width-sized image (using px, no following whitespace)
-!! input
-[[Image:foobar.jpg|640px]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="640" height="73" /></a>
-</p>
-!!end
-
-!! test
-Width-sized image (using px, with following whitespace - test regression from r39467)
-!! input
-[[Image:foobar.jpg|640px ]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="640" height="73" /></a>
-</p>
-!!end
-
-!! test
-Width-sized image (using px, with preceding whitespace - test regression from r39467)
-!! input
-[[Image:foobar.jpg| 640px]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="640" height="73" /></a>
-</p>
-!!end
-
-!! test
-Another italics / bold test
-!! input
- ''' ''x'
-!! result
-<pre>'<i> </i>x'
-</pre>
-!!end
-
-# Note the results may be incorrect, as parserTest output included this:
-# XML error: Mismatched tag at byte 6120:
-# ...<dd> </dt></dl> </dd...
-!! test
-dt/dd/dl test
-!! options
-disabled
-!! input
-:;;;::
-!! result
-<dl><dd><dl><dt><dl><dt><dl><dt><dl><dd><dl><dd>
-</dd></dl>
-</dd></dl>
-</dt></dl>
-</dt></dl>
-</dt></dl>
-</dd></dl>
-
-!!end
-
-
-# Images with the "|" character in external URLs in comment tags; Eats half the comment, leaves unmatched "</a>" tag.
-!! test
-Images with the "|" character in the comment
-!! input
-[[image:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx">external</a> URL</div></div></div>
-
-!!end
-
-!! test
-[Before] HTML without raw HTML enabled ($wgRawHtml==false)
-!! input
-<html><script>alert(1);</script></html>
-!! result
-<p>&lt;html&gt;&lt;script&gt;alert(1);&lt;/script&gt;&lt;/html&gt;
-</p>
-!! end
-
-!! test
-HTML with raw HTML ($wgRawHtml==true)
-!! options
-rawhtml
-!! input
-<html><script>alert(1);</script></html>
-!! result
-<p><script>alert(1);</script>
-</p>
-!! end
-
-!! test
-Parents of subpages, one level up
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
-!! input
-[[../|L2]]
-!! result
-<p><a href="/index.php?title=Subpage_test/L1/L2&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1/L2 (page does not exist)">L2</a>
-</p>
-!! end
-
-
-!! test
-Parents of subpages, one level up, not named
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
-!! input
-[[../]]
-!! result
-<p><a href="/index.php?title=Subpage_test/L1/L2&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1/L2 (page does not exist)">Subpage test/L1/L2</a>
-</p>
-!! end
-
-
-
-!! test
-Parents of subpages, two levels up
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
-!! input
-[[../../|L1]]2
-
-[[../../|L1]]l
-!! result
-<p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1</a>2
-</p><p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1l</a>
-</p>
-!! end
-
-!! test
-Parents of subpages, two levels up, without trailing slash or name.
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
-!! input
-[[../..]]
-!! result
-<p>[[../..]]
-</p>
-!! end
-
-!! test
-Parents of subpages, two levels up, with lots of extra trailing slashes.
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
-!! input
-[[../../////]]
-!! result
-<p><a href="/index.php?title=Subpage_test/L1////&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1//// (page does not exist)">///</a>
-</p>
-!! end
-
-!! test
-Definition list code coverage
-!! input
-; title : def
-; title : def
-;title: def
-!! result
-<dl><dt> title &#160;</dt><dd> def
-</dd><dt> title&#160;</dt><dd> def
-</dd><dt>title</dt><dd> def
-</dd></dl>
-
-!! end
-
-!! test
-Don't fall for the self-closing div
-!! input
-<div>hello world</div/>
-!! result
-<div>hello world</div>
-
-!! end
-
-!! test
-MSGNW magic word
-!! input
-{{MSGNW:msg}}
-!! result
-<p>&#91;&#91;:Template:Msg&#93;&#93;
-</p>
-!! end
-
-!! test
-RAW magic word
-!! input
-{{RAW:QUERTY}}
-!! result
-<p><a href="/index.php?title=Template:QUERTY&amp;action=edit&amp;redlink=1" class="new" title="Template:QUERTY (page does not exist)">Template:QUERTY</a>
-</p>
-!! end
-
-# This isn't needed for XHTML conformance, but would be handy as a fallback security measure
-!! test
-Always escape literal '>' in output, not just after '<'
-!! input
-><>
-!! result
-<p>&gt;&lt;&gt;
-</p>
-!! end
-
-!! test
-Template caching
-!! input
-{{Test}}
-{{Test}}
-!! result
-<p>This is a test template
-This is a test template
-</p>
-!! end
-
-
-!! article
-MediaWiki:Fake
-!! text
-==header==
-!! endarticle
-
-!! test
-Inclusion of !userCanEdit() content
-!! input
-{{MediaWiki:Fake}}
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a>]</span> <span class="mw-headline" id="header">header</span></h2>
-
-!! end
-
-
-!! test
-Out-of-order TOC heading levels
-!! input
-==2==
-======6======
-===3===
-=1=
-=====5=====
-==2==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#6"><span class="tocnumber">1.1</span> <span class="toctext">6</span></a></li>
-<li class="toclevel-2 tocsection-3"><a href="#3"><span class="tocnumber">1.2</span> <span class="toctext">3</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-4"><a href="#1"><span class="tocnumber">2</span> <span class="toctext">1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-5"><a href="#5"><span class="tocnumber">2.1</span> <span class="toctext">5</span></a></li>
-<li class="toclevel-2 tocsection-6"><a href="#2_2"><span class="tocnumber">2.2</span> <span class="toctext">2</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2">2</span></h2>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a>]</span> <span class="mw-headline" id="6">6</span></h6>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a>]</span> <span class="mw-headline" id="3">3</span></h3>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a>]</span> <span class="mw-headline" id="1">1</span></h1>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a>]</span> <span class="mw-headline" id="5">5</span></h5>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2_2">2</span></h2>
-
-!! end
-
-
-!! test
-ISBN with a dummy number
-!! input
-ISBN ---
-!! result
-<p>ISBN ---
-</p>
-!! end
-
-
-!! test
-ISBN with space-delimited number
-!! input
-ISBN 92 9017 032 8
-!! result
-<p><a href="/wiki/Special:BookSources/9290170328" class="internal mw-magiclink-isbn">ISBN 92 9017 032 8</a>
-</p>
-!! end
-
-
-!! test
-ISBN with multiple spaces, no number
-!! input
-ISBN foo
-!! result
-<p>ISBN foo
-</p>
-!! end
-
-
-!! test
-ISBN length
-!! input
-ISBN 123456789
-
-ISBN 1234567890
-
-ISBN 12345678901
-!! result
-<p>ISBN 123456789
-</p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
-</p><p>ISBN 12345678901
-</p>
-!! end
-
-
-!! test
-ISBN with trailing year (bug 8110)
-!! input
-ISBN 1-234-56789-0 - 2006
-
-ISBN 1 234 56789 0 - 2006
-!! result
-<p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1-234-56789-0</a> - 2006
-</p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1 234 56789 0</a> - 2006
-</p>
-!! end
-
-
-!! test
-anchorencode
-!! input
-{{anchorencode:foo bar©#%n}}
-!! result
-<p>foo_bar.C2.A9.23.25n
-</p>
-!! end
-
-!! test
-anchorencode trims spaces
-!! input
-{{anchorencode: __pretty__please__}}
-!! result
-<p>pretty_please
-</p>
-!! end
-
-!! test
-anchorencode deals with links
-!! input
-{{anchorencode: [[hello|world]] [[hi]]}}
-!! result
-<p>world_hi
-</p>
-!! end
-
-!! test
-anchorencode deals with templates
-!! input
-{{anchorencode: {{Foo}} }}
-!! result
-<p>FOO
-</p>
-!! end
-
-!! test
-anchorencode encodes like the TOC generator: (bug 18431)
-!! input
-=== _ +:.3A%3A&&amp;]] ===
-{{anchorencode: _ +:.3A%3A&&amp;]] }}
-__NOEDITSECTION__
-!! result
-<h3> <span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D"> _ +:.3A%3A&amp;&amp;]] </span></h3>
-<p>.2B:.3A.253A.26.26.5D.5D
-</p>
-!! end
-
-# Expected output in the following test is not necessarily expected (there
-# should probably be <p> tags inside the <blockquote> in the output) -- it's
-# only testing for well-formedness.
-!! test
-Bug 6200: blockquotes and paragraph formatting
-!! input
-<blockquote>
-foo
-</blockquote>
-
-bar
-
- baz
-!! result
-<blockquote>
-foo
-</blockquote>
-<p>bar
-</p>
-<pre>baz
-</pre>
-!! end
-
-!! test
-Bug 8293: Use of center tag ruins paragraph formatting
-!! input
-<center>
-foo
-</center>
-
-bar
-
- baz
-!! result
-<center>
-<p>foo
-</p>
-</center>
-<p>bar
-</p>
-<pre>baz
-</pre>
-!! end
-
-
-###
-### Language variants related tests
-###
-!! test
-Self-link in language variants
-!! options
-title=[[Dunav]] language=sr
-!! input
-Both [[Dunav]] and [[Дунав]] are names for this river.
-!! result
-<p>Both <strong class="selflink">Dunav</strong> and <strong class="selflink">Дунав</strong> are names for this river.
-</p>
-!!end
-
-
-!! test
-Link to pages in language variants
-!! options
-language=sr
-!! input
-Main Page can be written as [[Маин Паге]]
-!! result
-<p>Main Page can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>
-</p>
-!!end
-
-
-!! test
-Multiple links to pages in language variants
-!! options
-language=sr
-!! input
-[[Main Page]] can be written as [[Маин Паге]] same as [[Маин Паге]].
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a> can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a> same as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>.
-</p>
-!!end
-
-
-!! test
-Simple template in language variants
-!! options
-language=sr
-!! input
-{{тест}}
-!! result
-<p>This is a test template
-</p>
-!! end
-
-
-!! test
-Template with explicit namespace in language variants
-!! options
-language=sr
-!! input
-{{Template:тест}}
-!! result
-<p>This is a test template
-</p>
-!! end
-
-
-!! test
-Basic test for template parameter in language variants
-!! options
-language=sr
-!! input
-{{парамтест|param=foo}}
-!! result
-<p>This is a test template with parameter foo
-</p>
-!! end
-
-
-!! test
-Simple category in language variants
-!! options
-language=sr cat
-!! input
-[[Category:МедиаWики Усер'с Гуиде]]
-!! result
-<a href="/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%98%D0%B0:MediaWiki_User%27s_Guide" title="Категорија:MediaWiki User's Guide">MediaWiki User's Guide</a>
-!! end
-
-
-!! test
-Stripping -{}- tags (language variants)
-!! options
-language=sr
-!! input
-Latin proverb: -{Ne nuntium necare}-
-!! result
-<p>Latin proverb: Ne nuntium necare
-</p>
-!! end
-
-
-!! test
-Prevent conversion with -{}- tags (language variants)
-!! options
-language=sr variant=sr-ec
-!! input
-Latinski: -{Ne nuntium necare}-
-!! result
-<p>Латински: Ne nuntium necare
-</p>
-!! end
-
-
-!! test
-Prevent conversion of text with -{}- tags (language variants)
-!! options
-language=sr variant=sr-ec
-!! input
-Latinski: -{Ne nuntium necare}-
-!! result
-<p>Латински: Ne nuntium necare
-</p>
-!! end
-
-
-!! test
-Prevent conversion of links with -{}- tags (language variants)
-!! options
-language=sr variant=sr-ec
-!! input
--{[[Main Page]]}-
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
-!! end
-
-
-!! test
--{}- tags within headlines (within html for parserConvert())
-!! options
-language=sr variant=sr-ec
-!! input
-== -{Naslov}- ==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уредите одељак „Naslov“">уреди</a>]</span> <span class="mw-headline" id="-.7BNaslov.7D-"> Naslov </span></h2>
-
-!! end
-
-
-!! test
-Explicit definition of language variant alternatives
-!! options
-language=zh variant=zh-tw
-!! input
--{zh:China;zh-tw:Taiwan}-, not China
-!! result
-<p>Taiwan, not China
-</p>
-!! end
-
-
-!! test
-Explicit session-wise language variant mapping (A flag and - flag)
-!! options
-language=zh variant=zh-tw
-!! input
-Taiwan is not China.
-But -{A|zh:China;zh-tw:Taiwan}- is China,
-(This-{-|zh:China;zh-tw:Taiwan}- should be stripped!)
-and -{China}- is China.
-!! result
-<p>Taiwan is not China.
-But Taiwan is Taiwan,
-(This should be stripped!)
-and China is China.
-</p>
-!! end
-
-!! test
-Explicit session-wise language variant mapping (H flag for hide)
-!! options
-language=zh variant=zh-tw
-!! input
-(This-{H|zh:China;zh-tw:Taiwan}- should be stripped!)
-Taiwan is China.
-!! result
-<p>(This should be stripped!)
-Taiwan is Taiwan.
-</p>
-!! end
-
-!! test
-Adding explicit conversion rule for title (T flag)
-!! options
-language=zh variant=zh-tw showtitle
-!! input
-Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
-!! result
-Taiwan
-<p>Should be stripped!
-</p>
-!! end
-
-!! test
-Testing that changing the language variant here in the tests actually works
-!! options
-language=zh variant=zh showtitle
-!! input
-Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
-!! result
-China
-<p>Should be stripped!
-</p>
-!! end
-
-!! test
-Bug 24072: more test on conversion rule for title
-!! options
-language=zh variant=zh-tw showtitle
-!! input
-This should be stripped-{T|zh:China;zh-tw:Taiwan}-!
-This won't take interferes with the title rule-{H|zh:Beijing;zh-tw:Taipei}-.
-!! result
-Taiwan
-<p>This should be stripped!
-This won't take interferes with the title rule.
-</p>
-!! end
-
-!! test
-Raw output of variant escape tags (R flag)
-!! options
-language=zh variant=zh-tw
-!! input
-Raw: -{R|zh:China;zh-tw:Taiwan}-
-!! result
-<p>Raw: zh:China;zh-tw:Taiwan
-</p>
-!! end
-
-!! test
-Nested using of manual convert syntax
-!! options
-language=zh variant=zh-hk
-!! input
-Nested: -{zh-hans:Hi -{zh-cn:China;zh-sg:Singapore;}-;zh-hant:Hello -{zh-tw:Taiwan;zh-hk:H-{ong}- K-{}-ong;}-;}-!
-!! result
-<p>Nested: Hello Hong Kong!
-</p>
-!! end
-
-!! test
-Do not convert roman numbers to language variants
-!! options
-language=sr variant=sr-ec
-!! input
-Fridrih IV je car.
-!! result
-<p>Фридрих IV је цар.
-</p>
-!! end
-
-!! test
-Unclosed language converter markup "-{"
-!! options
-language=sr
-!! input
--{T|hello
-!! result
-<p>-{T|hello
-</p>
-!! end
-
-!! test
-Don't convert raw rule "-{R|=&gt;}-" to "=>"
-!! options
-language=sr
-!! input
--{R|=&gt;}-
-!! result
-<p>=&gt;
-</p>
-!!end
-
-!!article
-Template:Bullet
-!!text
-* Bar
-!!endarticle
-
-!! test
-Bug 529: Uncovered bullet
-!! input
-* Foo {{bullet}}
-!! result
-<ul><li> Foo
-</li><li> Bar
-</li></ul>
-
-!! end
-
-!! test
-Bug 529: Uncovered table already at line-start
-!! input
-x
-
-{{table}}
-y
-!! result
-<p>x
-</p>
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
-<p>y
-</p>
-!! end
-
-!! test
-Bug 529: Uncovered bullet in parser function result
-!! input
-* Foo {{lc:{{bullet}} }}
-!! result
-<ul><li> Foo
-</li><li> bar
-</li></ul>
-
-!! end
-
-!! test
-Bug 5678: Double-parsed template argument
-!! input
-{{lc:{{{1}}}|hello}}
-!! result
-<p>{{{1}}}
-</p>
-!! end
-
-!! test
-Bug 5678: Double-parsed template invocation
-!! input
-{{lc:{{paramtest {{!}} param = hello }} }}
-!! result
-<p>{{paramtest | param = hello }}
-</p>
-!! end
-
-!! test
-Case insensitivity of parser functions for non-ASCII characters (bug 8143)
-!! options
-language=cs
-title=[[Main Page]]
-!! input
-{{PRVNÍVELKÉ:ěščř}}
-{{prvnívelké:ěščř}}
-{{PRVNÍMALÉ:ěščř}}
-{{prvnímalé:ěščř}}
-{{MALÁ:ěščř}}
-{{malá:ěščř}}
-{{VELKÁ:ěščř}}
-{{velká:ěščř}}
-!! result
-<p>Ěščř
-Ěščř
-ěščř
-ěščř
-ěščř
-ěščř
-ĚŠČŘ
-ĚŠČŘ
-</p>
-!! end
-
-!! test
-Morwen/13: Unclosed link followed by heading
-!! input
-[[link
-==heading==
-!! result
-<p>[[link
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
-
-!! end
-
-!! test
-HHP2.1: Heuristics for headings in preprocessor parenthetical structures
-!! input
-{{foo|
-=heading=
-!! result
-<p>{{foo|
-</p>
-<h1> <span class="mw-headline" id="heading">heading</span></h1>
-
-!! end
-
-!! test
-HHP2.2: Heuristics for headings in preprocessor parenthetical structures
-!! input
-{{foo|
-==heading==
-!! result
-<p>{{foo|
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
-
-!! end
-
-!! test
-Tildes in comments
-!! options
-pst
-!! input
-<!-- ~~~~ -->
-!! result
-<!-- ~~~~ -->
-!! end
-
-!! test
-Paragraphs inside divs (no extra line breaks)
-!! input
-<div>Line one
-
-Line two</div>
-!! result
-<div>Line one
-Line two</div>
-
-!! end
-
-!! test
-Paragraphs inside divs (extra line break on open)
-!! input
-<div>
-Line one
-
-Line two</div>
-!! result
-<div>
-<p>Line one
-</p>
-Line two</div>
-
-!! end
-
-!! test
-Paragraphs inside divs (extra line break on close)
-!! input
-<div>Line one
-
-Line two
-</div>
-!! result
-<div>Line one
-<p>Line two
-</p>
-</div>
-
-!! end
-
-!! test
-Paragraphs inside divs (extra line break on open and close)
-!! input
-<div>
-Line one
-
-Line two
-</div>
-!! result
-<div>
-<p>Line one
-</p><p>Line two
-</p>
-</div>
-
-!! end
-
-!! test
-Nesting tags, paragraphs on lines which begin with <div>
-!! options
-disabled
-!! input
-<div></div><strong>A
-B</strong>
-!! result
-<div></div>
-<p><strong>A
-B</strong>
-</p>
-!! end
-
-# Bug 6200: <blockquote> should behave like <div> with respect to line breaks
-!! test
-Bug 6200: paragraphs inside blockquotes (no extra line breaks)
-!! options
-disabled
-!! input
-<blockquote>Line one
-
-Line two</blockquote>
-!! result
-<blockquote>Line one
-Line two</blockquote>
-
-!! end
-
-!! test
-Bug 6200: paragraphs inside blockquotes (extra line break on open)
-!! options
-disabled
-!! input
-<blockquote>
-Line one
-
-Line two</blockquote>
-!! result
-<blockquote>
-<p>Line one
-</p>
-Line two</blockquote>
-
-!! end
-
-!! test
-Bug 6200: paragraphs inside blockquotes (extra line break on close)
-!! options
-disabled
-!! input
-<blockquote>Line one
-
-Line two
-</blockquote>
-!! result
-<blockquote>Line one
-<p>Line two
-</p>
-</blockquote>
-
-!! end
-
-!! test
-Bug 6200: paragraphs inside blockquotes (extra line break on open and close)
-!! options
-disabled
-!! input
-<blockquote>
-Line one
-
-Line two
-</blockquote>
-!! result
-<blockquote>
-<p>Line one
-</p><p>Line two
-</p>
-</blockquote>
-
-!! end
-
-!! test
-Paragraphs inside blockquotes/divs (no extra line breaks)
-!! input
-<blockquote><div>Line one
-
-Line two</div></blockquote>
-!! result
-<blockquote><div>Line one
-Line two</div></blockquote>
-
-!! end
-
-!! test
-Paragraphs inside blockquotes/divs (extra line break on open)
-!! input
-<blockquote><div>
-Line one
-
-Line two</div></blockquote>
-!! result
-<blockquote><div>
-<p>Line one
-</p>
-Line two</div></blockquote>
-
-!! end
-
-!! test
-Paragraphs inside blockquotes/divs (extra line break on close)
-!! input
-<blockquote><div>Line one
-
-Line two
-</div></blockquote>
-!! result
-<blockquote><div>Line one
-<p>Line two
-</p>
-</div></blockquote>
-
-!! end
-
-!! test
-Paragraphs inside blockquotes/divs (extra line break on open and close)
-!! input
-<blockquote><div>
-Line one
-
-Line two
-</div></blockquote>
-!! result
-<blockquote><div>
-<p>Line one
-</p><p>Line two
-</p>
-</div></blockquote>
-
-!! end
-
-!! test
-Interwiki links trounced by replaceExternalLinks after early LinkHolderArray expansion
-!! options
-wgLinkHolderBatchSize=0
-!! input
-[[meatball:1]]
-[[meatball:2]]
-[[meatball:3]]
-!! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl?1" class="extiw" title="meatball:1">meatball:1</a>
-<a href="http://www.usemod.com/cgi-bin/mb.pl?2" class="extiw" title="meatball:2">meatball:2</a>
-<a href="http://www.usemod.com/cgi-bin/mb.pl?3" class="extiw" title="meatball:3">meatball:3</a>
-</p>
-!! end
-
-!! test
-Free external link invading image caption
-!! input
-[[Image:Foobar.jpg|thumb|http://x|hello]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>hello</div></div></div>
-
-!! end
-
-!! test
-Bug 15196: localised external link numbers
-!! options
-language=fa
-!! input
-[http://en.wikipedia.org/]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://en.wikipedia.org/">[۱]</a>
-</p>
-!! end
-
-!! test
-Multibyte character in padleft
-!! input
-{{padleft:-Hello|7|Æ}}
-!! result
-<p>Æ-Hello
-</p>
-!! end
-
-!! test
-Multibyte character in padright
-!! input
-{{padright:Hello-|7|Æ}}
-!! result
-<p>Hello-Æ
-</p>
-!! end
-
-!! test
-Formatted date
-!! config
-wgUseDynamicDates=1
-!! input
-[[2009-03-24]]
-!! result
-<p><span class="mw-formatted-date" title="2009-03-24"><a href="/index.php?title=2009&amp;action=edit&amp;redlink=1" class="new" title="2009 (page does not exist)">2009</a>-<a href="/index.php?title=March_24&amp;action=edit&amp;redlink=1" class="new" title="March 24 (page does not exist)">03-24</a></span>
-</p>
-!!end
-
-!!test
-formatdate parser function
-!!input
-{{#formatdate:2009-03-24}}
-!! result
-<p><span class="mw-formatted-date" title="2009-03-24">2009-03-24</span>
-</p>
-!! end
-
-!!test
-formatdate parser function, with default format
-!!input
-{{#formatdate:2009-03-24|mdy}}
-!! result
-<p><span class="mw-formatted-date" title="2009-03-24">March 24, 2009</span>
-</p>
-!! end
-
-!! test
-Linked date with autoformatting disabled
-!! config
-wgUseDynamicDates=false
-!! input
-[[2009-03-24]]
-!! result
-<p><a href="/index.php?title=2009-03-24&amp;action=edit&amp;redlink=1" class="new" title="2009-03-24 (page does not exist)">2009-03-24</a>
-</p>
-!! end
-
-!! test
-Spacing of numbers in formatted dates
-!! input
-{{#formatdate:January 15}}
-!! result
-<p><span class="mw-formatted-date" title="01-15">January 15</span>
-</p>
-!! end
-
-!! test
-Spacing of numbers in formatted dates (linked)
-!! config
-wgUseDynamicDates=true
-!! input
-[[January 15]]
-!! result
-<p><span class="mw-formatted-date" title="01-15"><a href="/index.php?title=January_15&amp;action=edit&amp;redlink=1" class="new" title="January 15 (page does not exist)">January 15</a></span>
-</p>
-!! end
-
-!! test
-formatdate parser function, with default format and on a page of which the content language is always English and different from the wiki content language
-!! options
-language=nl title=[[MediaWiki:Common.css]]
-!! input
-{{#formatdate:2009-03-24|dmy}}
-!! result
-<p><span class="mw-formatted-date" title="2009-03-24">24 March 2009</span>
-</p>
-!! end
-
-#
-#
-#
-
-#
-# Edit comments
-#
-
-!! test
-Edit comment with link
-!! options
-comment
-!! input
-I like the [[Main Page]] a lot
-!! result
-I like the <a href="/wiki/Main_Page" title="Main Page">Main Page</a> a lot
-!!end
-
-!! test
-Edit comment with link and link text
-!! options
-comment
-!! input
-I like the [[Main Page|best pages]] a lot
-!! result
-I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
-!!end
-
-!! test
-Edit comment with link and link text with suffix
-!! options
-comment
-!! input
-I like the [[Main Page|best page]]s a lot
-!! result
-I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
-!!end
-
-!! test
-Edit comment with section link (non-local, eg in history list)
-!! options
-comment title=[[Main Page]]
-!! input
-/* External links */ removed bogus entries
-!! result
-<a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
-!!end
-
-!! test
-Edit comment with section link and text before it (non-local, eg in history list)
-!! options
-comment title=[[Main Page]]
-!! input
-pre-comment text /* External links */ removed bogus entries
-!! result
-pre-comment text - <a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
-!!end
-
-!! test
-Edit comment with section link (local, eg in diff view)
-!! options
-comment local title=[[Main Page]]
-!! input
-/* External links */ removed bogus entries
-!! result
-<a href="#External_links">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
-!!end
-
-!! test
-Edit comment with subpage link (bug 14080)
-!! options
-comment
-subpage
-title=[[Subpage test]]
-!! input
-Poked at a [[/subpage]] here...
-!! result
-Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a> here...
-!!end
-
-!! test
-Edit comment with subpage link and link text (bug 14080)
-!! options
-comment
-subpage
-title=[[Subpage test]]
-!! input
-Poked at a [[/subpage|neat little page]] here...
-!! result
-Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">neat little page</a> here...
-!!end
-
-!! test
-Edit comment with bogus subpage link in non-subpage NS (bug 14080)
-!! options
-comment
-title=[[Subpage test]]
-!! input
-Poked at a [[/subpage]] here...
-!! result
-Poked at a <a href="/index.php?title=/subpage&amp;action=edit&amp;redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a> here...
-!!end
-
-!! test
-Edit comment with bare anchor link (local, as on diff)
-!! options
-comment
-local
-title=[[Main Page]]
-!!input
-[[#section]]
-!! result
-<a href="#section">#section</a>
-!! end
-
-!! test
-Edit comment with bare anchor link (non-local, as on history)
-!! options
-comment
-title=[[Main Page]]
-!!input
-[[#section]]
-!! result
-<a href="/wiki/Main_Page#section" title="Main Page">#section</a>
-!! end
-
-!! test
-Anchor starting with underscore
-!!input
-[[#_ref|One]]
-!! result
-<p><a href="#_ref">One</a>
-</p>
-!! end
-
-!! test
-Id starting with underscore
-!!input
-<div id="_ref"></div>
-!! result
-<div id="_ref"></div>
-
-!! end
-
-!! test
-Space normalisation on autocomment (bug 22784)
-!! options
-comment
-title=[[Main Page]]
-!!input
-/* __hello__world__ */
-!! result
-<a href="/wiki/Main_Page#hello_world" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">__hello__world__</span></span>
-!! end
-
-!! test
-percent-encoding and + signs in comments (Bug 26410)
-!! options
-comment
-!!input
-[[ABC%33D% ++]] [[ABC%33D% ++|+%20]]
-!! result
-<a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">ABC3D% ++</a> <a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">+%20</a>
-!! end
-
-!! test
-Bad images - basic functionality
-!! options
-disabled
-!! input
-[[File:Bad.jpg]]
-!! result
-!! end
-
-!! test
-Bad images - bug 16039: text after bad image disappears
-!! options
-disabled
-!! input
-Foo bar
-[[File:Bad.jpg]]
-Bar foo
-!! result
-<p>Foo bar
-</p><p>Bar foo
-</p>
-!! end
-
-!! test
-Verify that displaytitle works (bug #22501) no displaytitle
-!! options
-showtitle
-!! config
-wgAllowDisplayTitle=true
-wgRestrictDisplayTitle=false
-!! input
-this is not the the title
-!! result
-Parser test
-<p>this is not the the title
-</p>
-!! end
-
-!! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=false
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=true
-wgRestrictDisplayTitle=false
-!! input
-this is not the the title
-{{DISPLAYTITLE:whatever}}
-!! result
-whatever
-<p>this is not the the title
-</p>
-!! end
-
-!! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=true mismatch
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=true
-wgRestrictDisplayTitle=true
-!! input
-this is not the the title
-{{DISPLAYTITLE:whatever}}
-!! result
-Screen
-<p>this is not the the title
-</p>
-!! end
-
-!! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=true matching
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=true
-wgRestrictDisplayTitle=true
-!! input
-this is not the the title
-{{DISPLAYTITLE:screen}}
-!! result
-screen
-<p>this is not the the title
-</p>
-!! end
-
-!! test
-Verify that displaytitle works (bug #22501) AllowDisplayTitle=false
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=false
-!! input
-this is not the the title
-{{DISPLAYTITLE:screen}}
-!! result
-Screen
-<p>this is not the the title
-<a href="/index.php?title=Template:DISPLAYTITLE:screen&amp;action=edit&amp;redlink=1" class="new" title="Template:DISPLAYTITLE:screen (page does not exist)">Template:DISPLAYTITLE:screen</a>
-</p>
-!! end
-
-!! test
-Verify that displaytitle works (bug #22501) AllowDisplayTitle=false no DISPLAYTITLE
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=false
-!! input
-this is not the the title
-!! result
-Screen
-<p>this is not the the title
-</p>
-!! end
-
-!! test
-preload: check <noinclude> and <includeonly>
-!! options
-preload
-!! input
-Hello <noinclude>cruel</noinclude><includeonly>kind</includeonly> world.
-!! result
-Hello kind world.
-!! end
-
-!! test
-preload: check <onlyinclude>
-!! options
-preload
-!! input
-Goodbye <onlyinclude>Hello world</onlyinclude>
-!! result
-Hello world
-!! end
-
-!! test
-preload: can pass tags through if we want to
-!! options
-preload
-!! input
-<includeonly><</includeonly>includeonly>Hello world<includeonly><</includeonly>/includeonly>
-!! result
-<includeonly>Hello world</includeonly>
-!! end
-
-!! test
-preload: check that it doesn't try to do tricks
-!! options
-preload
-!! input
-* <!-- Hello --> ''{{world}}'' {{<includeonly>subst:</includeonly>How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
-!! result
-* <!-- Hello --> ''{{world}}'' {{subst:How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
-!! end
-
-!! test
-Play a bit with r67090 and bug 3158
-!! options
-disabled
-!! input
-<div style="width:50% !important">&nbsp;</div>
-<div style="width:50%&nbsp;!important">&nbsp;</div>
-<div style="width:50%&#160;!important">&nbsp;</div>
-<div style="border : solid;">&nbsp;</div>
-!! result
-<div style="width:50% !important">&nbsp;</div>
-<div style="width:50% !important">&nbsp;</div>
-<div style="width:50% !important">&nbsp;</div>
-<div style="border&#160;: solid;">&nbsp;</div>
-
-!! end
-
-!! test
-HTML5 data attributes
-!! input
-<span data-foo="bar">Baz</span>
-<p data-abc-def_hij="">Quuz</p>
-!! result
-<p><span data-foo="bar">Baz</span>
-</p>
-<p data-abc-def_hij="">Quuz</p>
-
-!! end
-
-!! test
-percent-encoding and + signs in internal links (Bug 26410)
-!! input
-[[User:+%]] [[Page+title%]]
-[[%+]] [[%+|%20]] [[%+ ]] [[%+r]]
-[[%]] [[+]] [[image:%+abc%39|foo|[[bar]]]]
-[[%33%45]] [[%33%45+]]
-!! result
-<p><a href="/index.php?title=User:%2B%25&amp;action=edit&amp;redlink=1" class="new" title="User:+% (page does not exist)">User:+%</a> <a href="/index.php?title=Page%2Btitle%25&amp;action=edit&amp;redlink=1" class="new" title="Page+title% (page does not exist)">Page+title%</a>
-<a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%+</a> <a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%20</a> <a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%+ </a> <a href="/index.php?title=%25%2Br&amp;action=edit&amp;redlink=1" class="new" title="%+r (page does not exist)">%+r</a>
-<a href="/index.php?title=%25&amp;action=edit&amp;redlink=1" class="new" title="% (page does not exist)">%</a> <a href="/index.php?title=%2B&amp;action=edit&amp;redlink=1" class="new" title="+ (page does not exist)">+</a> <a href="/index.php?title=Special:Upload&amp;wpDestFile=%25%2Babc9" class="new" title="File:%+abc9">bar</a>
-<a href="/index.php?title=3E&amp;action=edit&amp;redlink=1" class="new" title="3E (page does not exist)">3E</a> <a href="/index.php?title=3E%2B&amp;action=edit&amp;redlink=1" class="new" title="3E+ (page does not exist)">3E+</a>
-</p>
-!! end
-
-!! test
-Special characters in embedded file links (bug 27679)
-!! input
-[[File:Contains & ampersand.jpg]]
-[[File:Does not exist.jpg|Title with & ampersand]]
-!! result
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Contains_%26_ampersand.jpg" class="new" title="File:Contains &amp; ampersand.jpg">File:Contains &amp; ampersand.jpg</a>
-<a href="/index.php?title=Special:Upload&amp;wpDestFile=Does_not_exist.jpg" class="new" title="File:Does not exist.jpg">Title with &amp; ampersand</a>
-</p>
-!! end
-
-
-!! test
-Confirm that 'apos' named character reference doesn't make it to output (not legal in HTML 4)
-!! input
-Text&apos;s been normalized?
-!! result
-<p>Text&#39;s been normalized?
-</p>
-!! end
-
-!! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate free external links
-!! input
-http://www.example.org/ <-- U+3000 (vim: ^Vu3000)
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.org/">http://www.example.org/</a> &lt;-- U+3000 (vim: ^Vu3000)
-</p>
-!! end
-
-!! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
-!! input
-[http://www.example.org/ ideograms]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.org/">ideograms</a>
-</p>
-!! end
-
-!! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate external images links
-!! input
-http://www.example.org/pic.png <-- U+3000 (vim: ^Vu3000)
-!! result
-<p><img src="http://www.example.org/pic.png" alt="pic.png" /> &lt;-- U+3000 (vim: ^Vu3000)
-</p>
-!! end
-
-!! article
-Mediawiki:loop1
-!! text
-{{Identical|A}}
-!! endarticle
-
-!! article
-Mediawiki:loop2
-!! text
-{{Identical|B}}
-!! endarticle
-
-!! article
-Template:Identical
-!! text
-{{int:loop1}}
-{{int:loop2}}
-!! endarticle
-
-!! test
-Bug 31098 Template which includes system messages which includes the template
-!! input
-{{Identical}}
-!! result
-<p><span class="error">Template loop detected: <a href="/wiki/Template:Identical" title="Template:Identical">Template:Identical</a></span>
-<span class="error">Template loop detected: <a href="/wiki/Template:Identical" title="Template:Identical">Template:Identical</a></span>
-</p>
-!! end
-
-!! test
-Bug31490 Turkish: ucfirst 'blah'
-!! options
-language=tr
-!! input
-{{ucfirst:blah}}
-!! result
-<p>Blah
-</p>
-!! end
-
-!! test
-Bug31490 Turkish: ucfirst 'ix'
-!! options
-language=tr
-!! input
-{{ucfirst:ix}}
-!! result
-<p>İx
-</p>
-!! end
-
-!! test
-Bug31490 Turkish: lcfirst 'BLAH'
-!! options
-language=tr
-!! input
-{{lcfirst:BLAH}}
-!! result
-<p>bLAH
-</p>
-!! end
-
-!! test
-Bug31490 Turkish: ucfırst (with a dotless i)
-!! options
-language=tr
-!! input
-{{ucfırst:blah}}
-!! result
-<p><a href="/index.php?title=%C5%9Eablon:Ucf%C4%B1rst:blah&amp;action=edit&amp;redlink=1" class="new" title="Şablon:Ucfırst:blah (sayfa mevcut değil)">Şablon:Ucfırst:blah</a>
-</p>
-!! end
-
-!! test
-Bug31490 ucfırst (with a dotless i) with English language
-!! options
-language=en
-!! input
-{{ucfırst:blah}}
-!! result
-<p><a href="/index.php?title=Template:Ucf%C4%B1rst:blah&amp;action=edit&amp;redlink=1" class="new" title="Template:Ucfırst:blah (page does not exist)">Template:Ucfırst:blah</a>
-</p>
-!! end
-
-!! test
-Bug 26375: TOC with italics
-!! options
-title=[[Main Page]]
-!! input
-__TOC__
-== ''Lost'' episodes ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a>]</span> <span class="mw-headline" id="Lost_episodes"> <i>Lost</i> episodes </span></h2>
-
-!! end
-
-!! test
-Bug 26375: TOC with bold
-!! options
-title=[[Main Page]]
-!! input
-__TOC__
-== '''should be bold''' then normal text ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a>]</span> <span class="mw-headline" id="should_be_bold_then_normal_text"> <b>should be bold</b> then normal text </span></h2>
-
-!! end
-
-!! test
-Bug 33845: Headings become cursive in TOC when they contain an image
-!! options
-title=[[Main Page]]
-!! input
-__TOC__
-== Image [[Image:foobar.jpg]] ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a>]</span> <span class="mw-headline" id="Image"> Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> </span></h2>
-
-!! end
-
-!! test
-Bug 33845 (2): Headings become bold in TOC when they contain a blockquote
-!! options
-title=[[Main Page]]
-!! input
-__TOC__
-== <blockquote>Quote</blockquote> ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a>]</span> <span class="mw-headline" id="Quote"> <blockquote>Quote</blockquote> </span></h2>
-
-!! end
-
-!! test
-Unclosed tags in TOC
-!! options
-title=[[Main Page]]
-!! input
-__TOC__
-== Proof: 2 < 3 ==
-<small>Hanc marginis exiguitas non caperet.</small>
-QED
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a>]</span> <span class="mw-headline" id="Proof:_2_.3C_3"> Proof: 2 &lt; 3 </span></h2>
-<p><small>Hanc marginis exiguitas non caperet.</small>
-QED
-</p>
-!! end
-
-!! test
-Multiple tags in TOC
-!! input
-__TOC__
-== <i>Foo</i> <b>Bar</b> ==
-
-== <i>Foo</i> <blockquote>Bar</blockquote> ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Foo_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar"> <i>Foo</i> <b>Bar</b> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> <i>Foo</i> <blockquote>Bar</blockquote> </span></h2>
-
-!! end
-
-!! test
-Tags with parameters in TOC
-!! input
-__TOC__
-== <sup class="in-h2">Hello</sup> ==
-
-== <sup class="a > b">Evilbye</sup> ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b"&gt;Evilbye</sup></span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Hello">edit</a>]</span> <span class="mw-headline" id="Hello"> <sup class="in-h2">Hello</sup> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a>]</span> <span class="mw-headline" id="b.22.3EEvilbye"> <sup> b"&gt;Evilbye</sup> </span></h2>
-
-!! end
-
-!! article
-MediaWiki:Bug32057
-!! text
-== {{int:headline_sample}} ==
-!! endarticle
-
-!! test
-Bug 32057: Title needed when expanding <h> nodes.
-!! options
-title=[[Main Page]]
-!! input
-{{int:Bug32057}}
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a>]</span> <span class="mw-headline" id="Headline_text"> Headline text </span></h2>
-
-!! end
-
-!! test
-Strip marker in urlencode
-!! input
-{{urlencode:x<nowiki/>y}}
-{{urlencode:x<nowiki/>y|wiki}}
-{{urlencode:x<nowiki/>y|path}}
-!! result
-<p>xy
-xy
-xy
-</p>
-!! end
-
-!! test
-Strip marker in lc
-!! input
-{{lc:x<nowiki/>y}}
-!! result
-<p>xy
-</p>
-!! end
-
-!! test
-Strip marker in uc
-!! input
-{{uc:x<nowiki/>y}}
-!! result
-<p>XY
-</p>
-!! end
-
-!! test
-Strip marker in formatNum
-!! input
-{{formatnum:1<nowiki/>2}}
-{{formatnum:1<nowiki/>2|R}}
-!! result
-<p>12
-12
-</p>
-!! end
-
-!! test
-Strip marker in grammar
-!! options
-language=fi
-!! input
-{{grammar:elative|foo<nowiki/>bar}}
-!! result
-<p>foobarista
-</p>
-!! end
-
-!! test
-Strip marker in padleft
-!! input
-{{padleft:|2|x<nowiki/>y}}
-!! result
-<p>xy
-</p>
-!! end
-
-!! test
-Strip marker in padright
-!! input
-{{padright:|2|x<nowiki/>y}}
-!! result
-<p>xy
-</p>
-!! end
-
-!! test
-Strip marker in anchorencode
-!! input
-{{anchorencode:x<nowiki/>y}}
-!! result
-<p>xy
-</p>
-!! end
-
-!! test
-nowiki inside link inside heading (bug 18295)
-!! input
-==[[foo|x<nowiki>y</nowiki>z]]==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: xyz">edit</a>]</span> <span class="mw-headline" id="xyz"><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span></h2>
-
-!! end
-
-!! test
-new support for bdi element (bug 31817)
-!! input
-<p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 באפריל 1870–22 בינואר 1924) הוא מנהיג פוליטי קומוניסטי רוסי.</p>
-!! result
-<p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 באפריל 1870–22 בינואר 1924) הוא מנהיג פוליטי קומוניסטי רוסי.</p>
-
-!!end
-
-!! test
-Ignore pipe between table row attributes
-!! input
-{|
-| quux
-|- id=foo | style='color: red'
-| bar
-|}
-!! result
-<table>
-<tr>
-<td> quux
-</td></tr>
-<tr id="foo" style="color: red">
-<td> bar
-</td></tr></table>
-
-!! end
-
-!!test
-Gallery override link with WikiLink (bug 34852)
-!! input
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p>caption
-</p>
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!!test
-Gallery override link with absolute external link (bug 34852)
-!! input
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p>caption
-</p>
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!!test
-Gallery override link with malicious javascript (bug 34852)
-!! input
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p>caption
-</p>
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!!test
-Language parser function
-!! input
-{{#language:ar}}
-!! result
-<p>العربية
-</p>
-!! end
-
-!!test
-Padleft and padright as substr
-!! input
-{{padleft:|3|abcde}}
-{{padright:|3|abcde}}
-!! result
-<p>abc
-abc
-</p>
-!! end
-
-!!test
-Bug 34939 - Case insensitive link parsing ([HttP://])
-!! input
-[HttP://MediaWiki.Org/]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="HttP://MediaWiki.Org/">[1]</a>
-</p>
-!! end
-
-!!test
-Bug 34939 - Case insensitive link parsing ([HttP:// title])
-!! input
-[HttP://MediaWiki.Org/ MediaWiki]
-!! result
-<p><a rel="nofollow" class="external text" href="HttP://MediaWiki.Org/">MediaWiki</a>
-</p>
-!! end
-
-!!test
-Bug 34939 - Case insensitive link parsing (HttP://)
-!! input
-HttP://MediaWiki.Org/
-!! result
-<p><a rel="nofollow" class="external free" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a>
-</p>
-!! end
-
-
-TODO:
-more images
-more tables
-character entities
-and much more
-Try for 100% code coverage
diff --git a/tests/parser/parserTestsParserHook.php b/tests/parser/parserTestsParserHook.php
deleted file mode 100644
index 24d852c5..00000000
--- a/tests/parser/parserTestsParserHook.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * A basic extension that's used by the parser tests to test whether input and
- * arguments are passed to extensions properly.
- *
- * Copyright © 2005, 2006 Ævar Arnfjörð Bjarmason
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Testing
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- */
-
-class ParserTestParserHook {
-
- static function setup( &$parser ) {
- $parser->setHook( 'tag', array( __CLASS__, 'dumpHook' ) );
- $parser->setHook( 'statictag', array( __CLASS__, 'staticTagHook' ) );
- return true;
- }
-
- static function dumpHook( $in, $argv ) {
- ob_start();
- var_dump(
- $in,
- $argv
- );
- $ret = ob_get_clean();
-
- return "<pre>\n$ret</pre>";
- }
-
- static function staticTagHook( $in, $argv, $parser ) {
- if ( ! count( $argv ) ) {
- $parser->static_tag_buf = $in;
- return '';
- } elseif ( count( $argv ) === 1 && isset( $argv['action'] )
- && $argv['action'] === 'flush' && $in === null )
- {
- // Clear the buffer, we probably don't need to
- if ( isset( $parser->static_tag_buf ) ) {
- $tmp = $parser->static_tag_buf;
- } else {
- $tmp = '';
- }
- $parser->static_tag_buf = null;
- return $tmp;
- } else
- // wtf?
- return
- "\nCall this extension as <statictag>string</statictag> or as" .
- " <statictag action=flush/>, not in any other way.\n" .
- "text: " . var_export( $in, true ) . "\n" .
- "argv: " . var_export( $argv, true ) . "\n";
- }
-}
diff --git a/tests/parser/preprocess/All_system_messages.expected b/tests/parser/preprocess/All_system_messages.expected
deleted file mode 100644
index 897c5fb0..00000000
--- a/tests/parser/preprocess/All_system_messages.expected
+++ /dev/null
@@ -1,5646 +0,0 @@
-<root><template><title>int:allmessagestext</title></template>
-
-&lt;table border=1 width=100%&gt;&lt;tr&gt;&lt;td&gt;
-'''Name'''
-&lt;/td&gt;&lt;td&gt;
-'''Default text'''
-&lt;/td&gt;&lt;td&gt;
-'''Current text'''
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1movedto2&amp;action=edit 1movedto2]&lt;br&gt;
-[[MediaWiki_talk:1movedto2|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1 moved to $2
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:1movedto2</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Monobook.css&amp;action=edit Monobook.css]&lt;br&gt;
-[[MediaWiki_talk:Monobook.css|Talk]]
-&lt;/td&gt;&lt;td&gt;
-/* edit this file to customize the monobook skin for the entire site */
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Monobook.css</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:About&amp;action=edit about]&lt;br&gt;
-[[MediaWiki_talk:About|Talk]]
-&lt;/td&gt;&lt;td&gt;
-About
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:About</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Aboutpage&amp;action=edit aboutpage]&lt;br&gt;
-[[MediaWiki_talk:Aboutpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:About
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Aboutpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Aboutwikipedia&amp;action=edit aboutwikipedia]&lt;br&gt;
-[[MediaWiki_talk:Aboutwikipedia|Talk]]
-&lt;/td&gt;&lt;td&gt;
-About Wiktionary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Aboutwikipedia</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-addsection&amp;action=edit accesskey-addsection]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-addsection|Talk]]
-&lt;/td&gt;&lt;td&gt;
-+
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-addsection</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-anontalk&amp;action=edit accesskey-anontalk]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-anontalk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-n
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-anontalk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-anonuserpage&amp;action=edit accesskey-anonuserpage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-anonuserpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-anonuserpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-article&amp;action=edit accesskey-article]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-article|Talk]]
-&lt;/td&gt;&lt;td&gt;
-a
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-article</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-compareselectedversions&amp;action=edit accesskey-compareselectedversions]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-compareselectedversions|Talk]]
-&lt;/td&gt;&lt;td&gt;
-v
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-compareselectedversions</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-contributions&amp;action=edit accesskey-contributions]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-contributions|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-contributions&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-contributions</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-currentevents&amp;action=edit accesskey-currentevents]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-currentevents|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-currentevents&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-currentevents</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-delete&amp;action=edit accesskey-delete]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-delete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-d
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-delete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-edit&amp;action=edit accesskey-edit]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-edit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-e
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-edit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-emailuser&amp;action=edit accesskey-emailuser]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-emailuser|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-emailuser&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-emailuser</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-help&amp;action=edit accesskey-help]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-help|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-help&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-help</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-history&amp;action=edit accesskey-history]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-history|Talk]]
-&lt;/td&gt;&lt;td&gt;
-h
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-history</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-login&amp;action=edit accesskey-login]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-login|Talk]]
-&lt;/td&gt;&lt;td&gt;
-o
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-login</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-logout&amp;action=edit accesskey-logout]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-logout|Talk]]
-&lt;/td&gt;&lt;td&gt;
-o
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-logout</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mainpage&amp;action=edit accesskey-mainpage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-mainpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-z
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-mainpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-minoredit&amp;action=edit accesskey-minoredit]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-minoredit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-i
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-minoredit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-move&amp;action=edit accesskey-move]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-move|Talk]]
-&lt;/td&gt;&lt;td&gt;
-m
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-move</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mycontris&amp;action=edit accesskey-mycontris]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-mycontris|Talk]]
-&lt;/td&gt;&lt;td&gt;
-y
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-mycontris</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mytalk&amp;action=edit accesskey-mytalk]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-mytalk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-n
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-mytalk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-portal&amp;action=edit accesskey-portal]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-portal|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-portal&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-portal</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-preferences&amp;action=edit accesskey-preferences]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-preferences|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-preferences&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-preferences</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-preview&amp;action=edit accesskey-preview]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-preview|Talk]]
-&lt;/td&gt;&lt;td&gt;
-p
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-preview</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-protect&amp;action=edit accesskey-protect]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-protect|Talk]]
-&lt;/td&gt;&lt;td&gt;
-=
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-protect</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-randompage&amp;action=edit accesskey-randompage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-randompage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-x
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-randompage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-recentchanges&amp;action=edit accesskey-recentchanges]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-recentchanges|Talk]]
-&lt;/td&gt;&lt;td&gt;
-r
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-recentchanges</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-recentchangeslinked&amp;action=edit accesskey-recentchangeslinked]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-recentchangeslinked|Talk]]
-&lt;/td&gt;&lt;td&gt;
-c
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-recentchangeslinked</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-save&amp;action=edit accesskey-save]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-save|Talk]]
-&lt;/td&gt;&lt;td&gt;
-s
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-save</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-search&amp;action=edit accesskey-search]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-search|Talk]]
-&lt;/td&gt;&lt;td&gt;
-f
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-search</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-sitesupport&amp;action=edit accesskey-sitesupport]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-sitesupport|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-sitesupport&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-sitesupport</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-specialpage&amp;action=edit accesskey-specialpage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-specialpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-specialpage&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-specialpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-specialpages&amp;action=edit accesskey-specialpages]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-specialpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-q
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-specialpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-talk&amp;action=edit accesskey-talk]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-talk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-t
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-talk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-undelete&amp;action=edit accesskey-undelete]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-undelete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-d
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-undelete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-unwatch&amp;action=edit accesskey-unwatch]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-unwatch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-w
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-unwatch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-upload&amp;action=edit accesskey-upload]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-upload|Talk]]
-&lt;/td&gt;&lt;td&gt;
-u
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-upload</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-userpage&amp;action=edit accesskey-userpage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-userpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-userpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-viewsource&amp;action=edit accesskey-viewsource]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-viewsource|Talk]]
-&lt;/td&gt;&lt;td&gt;
-e
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-viewsource</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-watch&amp;action=edit accesskey-watch]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-watch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-w
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-watch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-watchlist&amp;action=edit accesskey-watchlist]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-watchlist|Talk]]
-&lt;/td&gt;&lt;td&gt;
-l
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-watchlist</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-whatlinkshere&amp;action=edit accesskey-whatlinkshere]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-whatlinkshere|Talk]]
-&lt;/td&gt;&lt;td&gt;
-b
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-whatlinkshere</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accmailtext&amp;action=edit accmailtext]&lt;br&gt;
-[[MediaWiki_talk:Accmailtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The Password for &amp;#39;$1&amp;#39; has been sent to $2.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accmailtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accmailtitle&amp;action=edit accmailtitle]&lt;br&gt;
-[[MediaWiki_talk:Accmailtitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Password sent.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accmailtitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Actioncomplete&amp;action=edit actioncomplete]&lt;br&gt;
-[[MediaWiki_talk:Actioncomplete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Action complete
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Actioncomplete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addedwatch&amp;action=edit addedwatch]&lt;br&gt;
-[[MediaWiki_talk:Addedwatch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Added to watchlist
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Addedwatch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addedwatchtext&amp;action=edit addedwatchtext]&lt;br&gt;
-[[MediaWiki_talk:Addedwatchtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The page &amp;quot;$1&amp;quot; has been added to your &amp;#91;&amp;#91;Special:Watchlist&amp;#124;watchlist]].
-Future changes to this page and its associated Talk page will be listed there,
-and the page will appear &amp;#39;&amp;#39;&amp;#39;bolded&amp;#39;&amp;#39;&amp;#39; in the &amp;#91;&amp;#91;Special:Recentchanges&amp;#124;list of recent changes]] to
-make it easier to pick out.
-
-&amp;lt;p&amp;gt;If you want to remove the page from your watchlist later, click &amp;quot;Stop watching&amp;quot; in the sidebar.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Addedwatchtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addsection&amp;action=edit addsection]&lt;br&gt;
-[[MediaWiki_talk:Addsection|Talk]]
-&lt;/td&gt;&lt;td&gt;
-+
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Addsection</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Administrators&amp;action=edit administrators]&lt;br&gt;
-[[MediaWiki_talk:Administrators|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:Administrators
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Administrators</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Affirmation&amp;action=edit affirmation]&lt;br&gt;
-[[MediaWiki_talk:Affirmation|Talk]]
-&lt;/td&gt;&lt;td&gt;
-I affirm that the copyright holder of this file
-agrees to license it under the terms of the $1.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Affirmation</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:All&amp;action=edit all]&lt;br&gt;
-[[MediaWiki_talk:All|Talk]]
-&lt;/td&gt;&lt;td&gt;
-all
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:All</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allmessages&amp;action=edit allmessages]&lt;br&gt;
-[[MediaWiki_talk:Allmessages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-All system messages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Allmessages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allmessagestext&amp;action=edit allmessagestext]&lt;br&gt;
-[[MediaWiki_talk:Allmessagestext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This is a list of all system messages available in the MediaWiki: namespace.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Allmessagestext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allpages&amp;action=edit allpages]&lt;br&gt;
-[[MediaWiki_talk:Allpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-All pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Allpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alphaindexline&amp;action=edit alphaindexline]&lt;br&gt;
-[[MediaWiki_talk:Alphaindexline|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1 to $2
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Alphaindexline</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alreadyloggedin&amp;action=edit alreadyloggedin]&lt;br&gt;
-[[MediaWiki_talk:Alreadyloggedin|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;font color=red&amp;gt;&amp;lt;b&amp;gt;User $1, you are already logged in!&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Alreadyloggedin</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alreadyrolled&amp;action=edit alreadyrolled]&lt;br&gt;
-[[MediaWiki_talk:Alreadyrolled|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Cannot rollback last edit of &amp;#91;&amp;#91;$1]]
-by &amp;#91;&amp;#91;User:$2&amp;#124;$2]] (&amp;#91;&amp;#91;User talk:$2&amp;#124;Talk]]); someone else has edited or rolled back the page already.
-
-Last edit was by &amp;#91;&amp;#91;User:$3&amp;#124;$3]] (&amp;#91;&amp;#91;User talk:$3&amp;#124;Talk]]).
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Alreadyrolled</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ancientpages&amp;action=edit ancientpages]&lt;br&gt;
-[[MediaWiki_talk:Ancientpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Oldest pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ancientpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:And&amp;action=edit and]&lt;br&gt;
-[[MediaWiki_talk:And|Talk]]
-&lt;/td&gt;&lt;td&gt;
-and
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:And</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anontalk&amp;action=edit anontalk]&lt;br&gt;
-[[MediaWiki_talk:Anontalk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Talk for this IP
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Anontalk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anontalkpagetext&amp;action=edit anontalkpagetext]&lt;br&gt;
-[[MediaWiki_talk:Anontalkpagetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-----&amp;#39;&amp;#39;This is the discussion page for an anonymous user who has not created an account yet or who does not use it. We therefore have to use the numerical &amp;#91;&amp;#91;IP address]] to identify him/her. Such an IP address can be shared by several users. If you are an anonymous user and feel that irrelevant comments have been directed at you, please &amp;#91;&amp;#91;Special:Userlogin&amp;#124;create an account or log in]] to avoid future confusion with other anonymous users.&amp;#39;&amp;#39;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Anontalkpagetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anonymous&amp;action=edit anonymous]&lt;br&gt;
-[[MediaWiki_talk:Anonymous|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Anonymous user(s) of Wiktionary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Anonymous</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Article&amp;action=edit article]&lt;br&gt;
-[[MediaWiki_talk:Article|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Content page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Article</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Articleexists&amp;action=edit articleexists]&lt;br&gt;
-[[MediaWiki_talk:Articleexists|Talk]]
-&lt;/td&gt;&lt;td&gt;
-A page of that name already exists, or the
-name you have chosen is not valid.
-Please choose another name.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Articleexists</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Articlepage&amp;action=edit articlepage]&lt;br&gt;
-[[MediaWiki_talk:Articlepage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View content page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Articlepage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Asksql&amp;action=edit asksql]&lt;br&gt;
-[[MediaWiki_talk:Asksql|Talk]]
-&lt;/td&gt;&lt;td&gt;
-SQL query
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Asksql</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Asksqltext&amp;action=edit asksqltext]&lt;br&gt;
-[[MediaWiki_talk:Asksqltext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Use the form below to make a direct query of the
-database.
-Use single quotes (&amp;#39;like this&amp;#39;) to delimit string literals.
-This can often add considerable load to the server, so please use
-this function sparingly.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Asksqltext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Autoblocker&amp;action=edit autoblocker]&lt;br&gt;
-[[MediaWiki_talk:Autoblocker|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Autoblocked because you share an IP address with &amp;quot;$1&amp;quot;. Reason &amp;quot;$2&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Autoblocker</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badarticleerror&amp;action=edit badarticleerror]&lt;br&gt;
-[[MediaWiki_talk:Badarticleerror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This action cannot be performed on this page.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badarticleerror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badfilename&amp;action=edit badfilename]&lt;br&gt;
-[[MediaWiki_talk:Badfilename|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Image name has been changed to &amp;quot;$1&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badfilename</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badfiletype&amp;action=edit badfiletype]&lt;br&gt;
-[[MediaWiki_talk:Badfiletype|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;quot;.$1&amp;quot; is not a recommended image file format.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badfiletype</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badipaddress&amp;action=edit badipaddress]&lt;br&gt;
-[[MediaWiki_talk:Badipaddress|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Invalid IP address
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badipaddress</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badquery&amp;action=edit badquery]&lt;br&gt;
-[[MediaWiki_talk:Badquery|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Badly formed search query
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badquery</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badquerytext&amp;action=edit badquerytext]&lt;br&gt;
-[[MediaWiki_talk:Badquerytext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-We could not process your query.
-This is probably because you have attempted to search for a
-word fewer than three letters long, which is not yet supported.
-It could also be that you have mistyped the expression, for
-example &amp;quot;fish and and scales&amp;quot;.
-Please try another query.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badquerytext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badretype&amp;action=edit badretype]&lt;br&gt;
-[[MediaWiki_talk:Badretype|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The passwords you entered do not match.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badretype</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badtitle&amp;action=edit badtitle]&lt;br&gt;
-[[MediaWiki_talk:Badtitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Bad title
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badtitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badtitletext&amp;action=edit badtitletext]&lt;br&gt;
-[[MediaWiki_talk:Badtitletext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The requested page title was invalid, empty, or
-an incorrectly linked inter-language or inter-wiki title.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badtitletext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blanknamespace&amp;action=edit blanknamespace]&lt;br&gt;
-[[MediaWiki_talk:Blanknamespace|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(Main)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blanknamespace</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockedtext&amp;action=edit blockedtext]&lt;br&gt;
-[[MediaWiki_talk:Blockedtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your user name or IP address has been blocked by $1.
-The reason given is this:&amp;lt;br /&amp;gt;&amp;#39;&amp;#39;$2&amp;#39;&amp;#39;&amp;lt;p&amp;gt;You may contact $1 or one of the other
-&amp;#91;&amp;#91;Wiktionary:Administrators&amp;#124;administrators]] to discuss the block.
-
-Note that you may not use the &amp;quot;email this user&amp;quot; feature unless you have a valid email address registered in your &amp;#91;&amp;#91;Special:Preferences&amp;#124;user preferences]].
-
-Your IP address is $3. Please include this address in any queries you make.
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockedtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockedtitle&amp;action=edit blockedtitle]&lt;br&gt;
-[[MediaWiki_talk:Blockedtitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-User is blocked
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockedtitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockip&amp;action=edit blockip]&lt;br&gt;
-[[MediaWiki_talk:Blockip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Block user
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockipsuccesssub&amp;action=edit blockipsuccesssub]&lt;br&gt;
-[[MediaWiki_talk:Blockipsuccesssub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Block succeeded
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockipsuccesssub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockipsuccesstext&amp;action=edit blockipsuccesstext]&lt;br&gt;
-[[MediaWiki_talk:Blockipsuccesstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;quot;$1&amp;quot; has been blocked.
-&amp;lt;br /&amp;gt;See &amp;#91;&amp;#91;Special:Ipblocklist&amp;#124;IP block list]] to review blocks.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockipsuccesstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockiptext&amp;action=edit blockiptext]&lt;br&gt;
-[[MediaWiki_talk:Blockiptext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Use the form below to block write access
-from a specific IP address or username.
-This should be done only only to prevent vandalism, and in
-accordance with &amp;#91;&amp;#91;Wiktionary:Policy&amp;#124;policy]].
-Fill in a specific reason below (for example, citing particular
-pages that were vandalized).
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockiptext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklink&amp;action=edit blocklink]&lt;br&gt;
-[[MediaWiki_talk:Blocklink|Talk]]
-&lt;/td&gt;&lt;td&gt;
-block
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklink</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklistline&amp;action=edit blocklistline]&lt;br&gt;
-[[MediaWiki_talk:Blocklistline|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1, $2 blocked $3 (expires $4)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklistline</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogentry&amp;action=edit blocklogentry]&lt;br&gt;
-[[MediaWiki_talk:Blocklogentry|Talk]]
-&lt;/td&gt;&lt;td&gt;
-blocked &amp;quot;$1&amp;quot; with an expiry time of $2
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklogentry</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogpage&amp;action=edit blocklogpage]&lt;br&gt;
-[[MediaWiki_talk:Blocklogpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Block_log
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklogpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogtext&amp;action=edit blocklogtext]&lt;br&gt;
-[[MediaWiki_talk:Blocklogtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This is a log of user blocking and unblocking actions. Automatically
-blocked IP addresses are not be listed. See the &amp;#91;&amp;#91;Special:Ipblocklist&amp;#124;IP block list]] for
-the list of currently operational bans and blocks.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklogtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bold_sample&amp;action=edit bold_sample]&lt;br&gt;
-[[MediaWiki_talk:Bold_sample|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Bold text
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bold_sample</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bold_tip&amp;action=edit bold_tip]&lt;br&gt;
-[[MediaWiki_talk:Bold_tip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Bold text
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bold_tip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Booksources&amp;action=edit booksources]&lt;br&gt;
-[[MediaWiki_talk:Booksources|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Book sources
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Booksources</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Booksourcetext&amp;action=edit booksourcetext]&lt;br&gt;
-[[MediaWiki_talk:Booksourcetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Below is a list of links to other sites that
-sell new and used books, and may also have further information
-about books you are looking for.Wiktionary is not affiliated with any of these businesses, and
-this list should not be construed as an endorsement.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Booksourcetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Brokenredirects&amp;action=edit brokenredirects]&lt;br&gt;
-[[MediaWiki_talk:Brokenredirects|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Broken Redirects
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Brokenredirects</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Brokenredirectstext&amp;action=edit brokenredirectstext]&lt;br&gt;
-[[MediaWiki_talk:Brokenredirectstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The following redirects link to a non-existing pages.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Brokenredirectstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bugreports&amp;action=edit bugreports]&lt;br&gt;
-[[MediaWiki_talk:Bugreports|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Bug reports
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bugreports</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bugreportspage&amp;action=edit bugreportspage]&lt;br&gt;
-[[MediaWiki_talk:Bugreportspage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:Bug_reports
-&lt;/td&gt;&lt;td&gt;
-<templ