"میڈیاویکی:Gadget-Extra-Editbuttons-tests.js" کے نسخوں کے درمیان فرق

شیعہ اشعار سے
dfghjk>Admin
م (۱ نسخه واردشده)
(کوئی فرق نہیں)

نسخہ بمطابق 19:24، 22 جون 2023ء

// <pre> // DO NOT REMOVE THIS LINE EVER
/*global $, mw, QUnit, persianWikiTools*/
/**
 * [[وپ:تست]]
 * Tests for:
 * * [[Mediawiki:Gadget-Extra-Editbuttons-persiantools.js]]
 * * [[Mediawiki:Gadget-Extra-Editbuttons-persianwikitools.js]]
 * * [[Mediawiki:Gadget-Extra-Editbuttons-autoed.js]]
 * * [[Mediawiki:Gadget-Extra-Editbuttons-dictionary.js]]
 */
//delay running of QUnit until tests are defined (T214854)
window.QUnit = {
    config: {
        autostart: false
    }
};
mw.loader.load('/w/resources/lib/qunitjs/qunit.css', 'text/css');
$.when(
    $.ready,
    $.getScript('/w/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-persiantools.js&action=raw&ctype=text/javascript'),
    $.getScript('/w/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-persianwikitools.js&action=raw&ctype=text/javascript'),
    $.getScript('/w/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-autoed.js&action=raw&ctype=text/javascript'),
    $.getScript('/w/index.php?title=MediaWiki:Gadget-Extra-Editbuttons-dictionary.js&&action=raw&ctype=text/javascript'),
    $.getScript('/w/resources/lib/qunitjs/qunit.js')
).then(function () {
    'use strict';
    mw.util.addCSS('#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar { font-family: inherit; } ' +
        '#qunit-testresult, .counts { font-family: inherit; direction: ltr; } #qunit-userAgent { display: none; } ' +
        '.test-name, .counts { unicode-bidi: -webkit-isolate; unicode-bidi: -moz-isolate; unicode-bidi: isolate; } ' +
        '.runtime { float: left; direction: ltr; } .qunit-source, tr.test-source td { direction: ltr; text-align: left; }');

    var test = QUnit.test;
    test('persianWikiTools.removeWikiSigne', function (assert) {
        var f = persianWikiTools.removeWikiSigne;
        assert.equal(
            f('1 [[a|b]] 2 [[b]] 3'),
            '1 b 2 b 3',
            'حذف ویکی‌سازی'
        );
    });

    test('persianWikiTools.wikiUrlMinifier', function (assert) {
        var f = persianWikiTools.wikiUrlMinifier;
        assert.equal(
            f('[https://fa.wikipedia.org/wiki/%D9%88%DB%8C%DA%98%D9%87:%D8%B3%DB%8C%D8%A7%D9%87%D9%87%D9%94_%D8%AE%D8%B1%D8%A7%D8%A8%DA%A9%D8%A7%D8%B1%DB%8C?wpSearchUser=Parto+hoor&wpSearchTitle=%D8%B7%D8%A7%D9%87%D8%B1%D9%87+%D9%82%D9%8A%D9%88%D9%85%DB%8C&wpSearchFilter= چندین پالایه]'),
            '[//fa.wikipedia.org/wiki/ویژه:سیاههٔ_خرابکاری?wpSearchUser=Parto+hoor&wpSearchTitle=طاهره+قيومی&wpSearchFilter= چندین پالایه]',
            'پیوندهای بیرونی پارامتردار را به اشتباه ویکی‌پیوند نکند.'
        );
        assert.equal(
            f('[https://fa.wikipedia.org/wiki/%D8%B4%D9%87%D8%B1%D8%B3%D8%AA%D8%A7%D9%86_%DA%AF%D8%A7%D9%84%D8%A7%D9%86%D8%AA%D8%A7 this]'),
            '[[شهرستان گالانتا|this]]',
            'کوتاه کردن پیوند'
        );


        assert.equal(
            f('متن https://www.iribnews.ir/fa/news/2993457/پیام-تسلیت-%C2%A0آیت-الله-مکارم-شیرازی-به-مناسبت-درگذشت-آیت-الله-علوی-سبزواری متن'),
            'متن https://www.iribnews.ir/fa/news/2993457/پیام-تسلیت-%C2%A0آیت-الله-مکارم-شیرازی-به-مناسبت-درگذشت-آیت-الله-علوی-سبزواری متن',
            'خراب نکردن پیوند'
        );
        assert.equal(
            f('{{یادکرد وب|عنوان=رقابتهاي واليبال ليگ برتر بانوان برگزار مي‌شود - ایسنا|نشانی=https://web.archive.org/web/20190609193121/https://www.isna.ir/news/8009-00121/%D8%B1%D9%82%D8%A7%D8%A8%D8%AA%D9%87%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D9%8A%D8%A8%D8%A7%D9%84-%D9%84%D9%8A%DA%AF-%D8%A8%D8%B1%D8%AA%D8%B1-%D8%A8%D8%A7%D9%86%D9%88%D8%A7%D9%86-%D8%A8%D8%B1%DA%AF%D8%B2%D8%A7%D8%B1-%D9%85%D9%8A-%D8%B4%D9%88%D8%AF|وبگاه=web.archive.org|تاریخ=2019-06-09|بازبینی=2019-06-09}}'),
            '{{یادکرد وب|عنوان=رقابتهاي واليبال ليگ برتر بانوان برگزار مي‌شود - ایسنا|نشانی=https://web.archive.org/web/20190609193121/https://www.isna.ir/news/8009-00121/%D8%B1%D9%82%D8%A7%D8%A8%D8%AA%D9%87%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D9%8A%D8%A8%D8%A7%D9%84-%D9%84%D9%8A%DA%AF-%D8%A8%D8%B1%D8%AA%D8%B1-%D8%A8%D8%A7%D9%86%D9%88%D8%A7%D9%86-%D8%A8%D8%B1%DA%AF%D8%B2%D8%A7%D8%B1-%D9%85%D9%8A-%D8%B4%D9%88%D8%AF|وبگاه=web.archive.org|تاریخ=2019-06-09|بازبینی=2019-06-09}}',
            'پیوند وب‌آرشیو را  دی‌کد نکند'
        );
        assert.equal(
            f('https://en.wikipedia.org/wiki/|'),
            'https://en.wikipedia.org/wiki/|',
            '| باعث شکستن نشانی نمی‌شود و در حالت عادی نیازی به کدشدن ندارد؛ شاید کدشدنش هم مشکل خاصی ایجاد نکند، جز اینکه خوانایی را مثلاً در نشانی‌های مرتبط با API کاهش می‌دهد'
        );
        assert.equal(
            f('https://en.wikipedia.org/wiki/^'),
            'https://en.wikipedia.org/wiki/^',
            'هشتک باعث شکستن نشانی نمی‌شود و در حالت عادی نیازی به کدشدن ندارد؛ شاید کدشدنش هم مشکل خاصی ایجاد نکند'
        );
        assert.equal(
            f('[https://example.com/][//example.com/]'),
            '[https://example.com/][//example.com/]',
            'دو نشانی پشت‌سرهم را ترکیب نکند'
        );
        assert.equal(
            f('https://en.wikipedia.org/w/index.php?title={}'),
            'https://en.wikipedia.org/w/index.php?title={}',
            'کروشهٔ باز یا بستهٔ تکی باعث شکستن نشانی نمی‌شوند و در حالت عادی نیازی به کدشدن ندارد'
        );
        assert.equal(
            f('https://en.wikipedia.org/w/index.php?title=`'),
            'https://en.wikipedia.org/w/index.php?title=`',
            'اکسان‌گرا باعث شکستن نشانی نمی‌شود؛ هرچند شاید کدشدنش هم مشکل خاصی ایجاد نکند'
        );
        assert.equal(
            f("https://example.com/> https://example.com/< example.com"),
            "https://example.com/> https://example.com/< example.com",
            'رفتار پیش‌فرض ویکی این است که سه نشانی از هم جدا هستند، در صورت کدشدن < یا > باعث تغییر در خروجی می‌شود. با دلیل یا مثال بهتر تغییر کند'
        );
        assert.equal(
            f("https://example.com/[https://example.com/][https://example.com/]https://example.com/"),
            "https://example.com/[https://example.com/][https://example.com/]https://example.com/",
            'کد کردن [ در اینجا باعث تغییریافتن رفتار پیش‌فرض ویکی و خروجی می‌شود'
        );
        assert.equal(
            f('[https://example.com/"(ویکی‌پدیای انگلیسی)"]'),
            '[https://example.com/"(ویکی‌پدیای انگلیسی)"]',
            '،کدکردن " در اینجا با رفتار پیش‌فرض مدیاویکی همخوانی ندارد، با این حال اگر احتمال می‌رود حالتی که بخشی از نشانی باشد پرکاربردتر باشد این تست قابل تغییر است'
        );
        assert.equal(
            f("https://en.wikipedia.org/wiki/'"),
            "https://en.wikipedia.org/wiki/'",
            '\' باعث شکستن نشانی نمی‌شود و در حالت عادی نیازی به کدشدن ندارد؛ شاید کدشدنش هم مشکل خاصی ایجاد نکند'
        );
        assert.equal(
            f('<a href="//meta.wikimedia.org/wiki/">[[text]]</a>'),
            '<a href="//meta.wikimedia.org/wiki/">[[text]]</a>',
            'نشانه‌گذاری‌های اچ‌تی‌ام‌ال کدگذاری نشوند'
        );
        assert.equal(
            f('[//meta.wikimedia.org/wiki/{{FULLPAGENAMEE}} https://meta.wikimedia.org/wiki/{{FULLPAGENAMEE}}]'),
            '[//meta.wikimedia.org/wiki/{{FULLPAGENAMEE}} https://meta.wikimedia.org/wiki/{{FULLPAGENAMEE}}]',
            '} و { می‌توانند بخشی از نشانه‌های ویکی باشند و نباید کدگذاری شوند'
        );
        assert.equal(
            f('https://fa.wikipedia.org/w/index.php?title=%D8%B4%D9%87%D8%B1%D9%88%D9%86%D8%AF%DB%8C&oldid=17950985#.D8.B4.D9.87.D8.B1.D9.88.D9.86.D8.AF.DB.8C_.D9.BE.D9.88.DB.8C.D8.A7'),
            'https://fa.wikipedia.org/w/index.php?title=شهروندی&oldid=17950985#.D8.B4.D9.87.D8.B1.D9.88.D9.86.D8.AF.DB.8C_.D9.BE.D9.88.DB.8C.D8.A7',
            'وقتی # نشانگر fragment است نباید encode شود، معنی‌اش را از دست می‌دهد.'
        );
        assert.equal(
            f('Wikipedia contributors, \"Tunnel diode,\" Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Tunnel_diode&oldid=611771583 (accessed September 7, 2014).'),
            'Wikipedia contributors, \"Tunnel diode,\" Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Tunnel_diode&oldid=611771583 (accessed September 7, 2014).',
            'یادکرد ویکی کپی‌شده از ویکی انگلیسی را تغییری ندهد.'
        );
        assert.equal(
            f('<ref>Travis Fahs (۱۱ March 2009)    http://cube.ign.com/articles/582/582869p1.html</ref>.{{سخ}}'),
            '<ref>Travis Fahs (۱۱ March 2009)    http://cube.ign.com/articles/582/582869p1.html</ref>.{{سخ}}',
            'عدم تغییر آکولاد بعد از نشانی'
        );
        assert.equal(
            f('Thirteen_Buddhas_of_Tama\n[https://en.wikipedia.org/wiki/Thirteen_Buddhas_of_Tama this]\n[https://fa.wikipedia.org/wiki/%D8%AC%D8%A7%DB%8C%D8%B2%D9%87_%D9%81%D8%B1%D9%87%D9%86%DA%AF%D8%B3%D8%AA%D8%A7%D9%86_%D8%B9%D9%84%D9%88%D9%85_%D9%88_%D9%87%D9%86%D8%B1%D9%87%D8%A7%DB%8C_%D8%B3%DB%8C%D9%86%D9%85%D8%A7%DB%8C%DB%8C_%D8%A2%D8%B1%DA%98%D8%A7%D9%86%D8%AA%DB%8C%D9%86 این]\n\nکتاب_متن'),
            'Thirteen_Buddhas_of_Tama\n[[:en:Thirteen Buddhas of Tama|this]]\n[[جایزه فرهنگستان علوم و هنرهای سینمایی آرژانتین|این]]\n\nکتاب_متن',
            'تبدیل نشانی اینترنتی ویکی‌پدیا به پیوند داخلی و میان‌ویکی‌پیوند'
        );
        assert.equal(
            f('//fa.wikipedia.org/wiki/%D9%85%DB%8C%D8%B2%20%DA%A9%D9%85%DA%A9'),
            '//fa.wikipedia.org/wiki/میز%20کمک',
            'از کد درآوردن بدون به وجود آوردن فاصله'
        );
    });
    test('persianWikiTools.SubSectionLeveling', function (assert) {
        var f = persianWikiTools.SubSectionLeveling;
        assert.equal(
            f("متن\n==متن بزرگ==\nمتن\n==== عنوان ====\nمتن"),
            'متن\n== متن بزرگ ==\nمتن\n==== عنوان ====\nمتن',
            'عدم اصلاح سطح‌بندی زیرعنوان‌ها زمانی که سطح دوم وجود دارد'
        );
        assert.equal(
            f("متن\n==== عنوان ====\nمتن\n== منابع ==\nمتن"),
            'متن\n== عنوان ==\nمتن\n== منابع ==\nمتن',
            'اصلاح سطح‌بندی زیرعنوان‌ها با وجودی که زیربخش منابع موجود است'
        );
        assert.equal(
            f("متن\n=== عنوان ===\nمتن\n==== عنوان ====\nمتن"),
            'متن\n== عنوان ==\nمتن\n=== عنوان ===\nمتن',
            'اصلاح سطح‌بندی زیرعنوان‌ها با سطح ۳ و ۴'
        );
        assert.equal(
            f("متن\n= عنوان =\nمتن\n=عنوان=\nمتن"),
            'متن\n== عنوان ==\nمتن\n== عنوان ==\nمتن',
            'اصلاح سطح‌بندی زیرعنوان‌ها با سطح ۱'
        );
    });
    test('persianWikiTools.wikiApplyOrthography', function (assert) {
        var f = persianWikiTools.wikiApplyOrthography;
        /*assert.equal(
            f('text\n\n<center>\ntext\n</center>\n\ntext\n\n<center>\ntext\n</center>'),
            'text\n\n{{وسط|\ntext\n}}\n\ntext\n\n{{وسط|\ntext\n}}',
            'تگ وسط‌چین با نزدیک‌ترین تگ خود همخوان شود'
        );*/
        assert.equal(
            f('شسیشسی\n{{نظرخواهی برای حذف/تاریخ‌دار|page=خانه ی شسیشسی|timestamp=}}\nشسیسشی'),
            'شسیشسی\n{{نظرخواهی برای حذف/تاریخ‌دار|page=خانه ی شسیشسی|timestamp=}}\nشسیسشی',
            'در الگوی نظرخواهی برای حذف تغییری ایجاد نکن'
        );
        assert.equal(
            f('متن متن و ... دیگر هیچ'),
            'متن متن و ... دیگر هیچ',
            'تبدیل سه نقطه به نویسهٔ سه نقطه'
        );
        assert.equal(
            f('[[پرونده:Brassiere-white.jpg|بندانگشتی|یک سینه‌بند فنری]]'),
            '[[پرونده:Brassiere-white.jpg|بندانگشتی|یک سینه‌بند فنری]]',
            'تبدیل فاصلهٔ نشکن به فاصلهٔ ساده'
        );
        assert.equal(
            f('متن [[رده:فیلم‌های درباره ایران]] و درباره متن'),
            'متن [[رده:فیلم‌های درباره ایران]] و دربارهٔ متن',
            '«درباره» را در رده و پیوند مدیاویکی را تغییر ندهد'
        );
        assert.equal(
            f('[[١٣٩١]] خورشیدی'),
            '[[١٣٩١]] خورشیدی',
            'اعداد را پاک نکند!'
        );
        assert.equal(
            f('تست درباره ام تست\nتست درباره تست\nدر این صفحه ۱۴۳ مورد است\nدر صفحه۱۴۳\nمتن'),
            'تست درباره‌ام تست\nتست دربارهٔ تست\nدر این صفحه ۱۴۳ مورد است\nدر صفحهٔ ۱۴۳\nمتن',
            'افزودن همزه'
        );
        assert.equal(
            f('<nowiki> </nowiki>و<pre>‌</' + 'pre>و<source lang="">\n</source><big></big><small></small>'),
            'وو',
            'حذف برچسب‌های خالی نرم‌افزار مدیاویکی'
        );
        assert.equal(
            f('<big><big><big>متن</big></big></big> و <big>متن</big> و <big><s>متن</s></big>'),
            '{{خیلی بزرگ|متن}} و {{درشت|متن}} و {{درشت|<s>متن</s>}}',
            'حذف برچسب‌های تکراری نرم‌افزار مدیاویکی'
        );
        /*assert.equal(
            f('<big><big>content1</big></big>\n<big><big><big><big>content2</big></big></big></big>\n<center>Content</center>\n<center><gallery>1\n2\n3|aa.jpg\n4</gallery></center>'
),
            '{{بزرگ|content1}}\n<span style="font-size: 38px;">content2</span>\n{{وسط|Content}}\n<gallery class="center">1\n2\n3|aa.jpg\n4</gallery>',
            'تبدیل برچسب‌ها بر پایه HTML5'
        );*/
        assert.equal(
            f('<nowiki>متن <code></code></nowiki> و <!--<nowiki></nowiki>--><source lang="">متن</source><sub>متن</sub>'),
            '<nowiki>متن </nowiki> و <!--<nowiki></nowiki>--><source lang=\"\">متن</source><sub>متن</sub>',
            'عدم حذف برچسب‌های خالی نرم‌افزار مدیاویکی که درون کامنت اچ‌تی‌ام‌ال هستند'
        );
        assert.equal(
            f('<gallery>\nپرونده:2از مجموعه ی حیرانی.jpg|از مجموعه ی حیرانی. رنگ و روغن روی بوم\n</gallery>'),
            '<gallery>\nپرونده:2از مجموعه ی حیرانی.jpg|از مجموعهٔ حیرانی. رنگ و روغن روی بوم\n</gallery>',
            'نام پرونده در داخل برچسب گالری نباید تغییر کند'
        );
        assert.equal(
            f('خانهء خانه ٔ خانه ء خانۀ من'),
            'خانهٔ خانهٔ خانهٔ خانهٔ من',
            'اصلاح نویسهٔ غیر استاندارد: ه و همزه بدون فاصله'
        );
        assert.equal(
            f('خودخواندۀایرانی'),
            'خودخواندهٔ ایرانی',
            'هنگام تبدیل ۀ به ه+همزه اگر بعد از آن فاصلهٔ مجازی بود به فاصله تبدیل کند'
        );
        assert.equal(
            f('خانه\u200cی خانه ی من'),
            'خانهٔ خانهٔ من',
            'اصلاح نویسهٔ غیر استاندارد: ه و ی'
        );
        assert.equal(
            f(':خانه ی\n:خانهء\n:خانه\u200cی '),
            ':خانهٔ\n:خانهٔ\n:خانهٔ ',
            'تغییر همزه و خط بعد'
        );
        assert.equal(
            f('حذف واکهٔٔ کوتاه اَِضافی از عیناًً و خانهٔٔ من'),
            'حذف واکهٔ کوتاه اِضافی از عیناً و خانهٔ من',
            'دو واکهٔ کوتاه هیچگاه پشت سرهم نمی‌آیند'
        );
        assert.equal(
            f('عمراً ً به من عمرا ً به تو'),
            'عمراً  به من عمراً  به تو',
            'نباید پیش از واکهٔ کوتاه فاصله بیاید+ حذف واکه‌های تکراری پشت سر هم'
        );
        assert.equal(
            f('منوچهر متَّکی'),
            'منوچهر متَّکی',
            'تشدید واکهٔ کوتاه نیست و آمدنش کنار واکهٔ کوتاه نباید موجب حذفش شود'
        );
    });

    test('persianWikiTools.wikiConvertToPersianCharacters', function (assert) {
        var f =    persianWikiTools.wikiConvertToPersianCharacters;
        assert.equal(
            f('{{Infobox Officeholder\n| image = هادي خسروشاهي.jpg\n}}'),
            '{{Infobox Officeholder\n| image = هادي خسروشاهي.jpg\n}}',
            'در پارامتر تصویر حروف عربی را فارسی نکند'
        );
        assert.equal(
            f('ﺍنگلیسی‌ها در سال تغلق ﺁباد موﻻنا'),
            'انگلیسی‌ها در سال تغلق آباد مولانا',
            'تیدیل نویسه تنهای الف به الف درست U+FE8D به U+0627'
        );
        assert.equal(
            f('دردﻫﻪ ۱۹۵۰، اﻧﻘﻼب ﺗﻜﻨﻮﻟﻮژی ﺑﺎ ﺳﺮﻋﺖ ﺑﺎﻻﻳﻲ رو ﺑﻪ ﺟﻠﻮ ﺣﺮﻛﺖ ﻣﻲﻛﺮد'),
            'دردهه ۱۹۵۰، انقلاب تکنولوژی با سرعت بالایی رو به جلو حرکت می\u200cکرد',
            'تبدیل کاراکترهای فرعی (منقطع) به کاراکتر اصلی'
        );
        assert.equal(
            f('{{شروع عربی}}مك عربي مك عربي{{پایان عربی}}'),
            '{{شروع عربی}}مك عربي مك عربي{{پایان عربی}}',
            'تغییر ندادن متن عربی'
        );
        assert.equal(
            f('{{به عربی|ي ك ى}} {{عربی|ي ك ى}} {{عبارت عربی|ي ك ى}} {{اردو|شرمین عبید چنائے}} {{به اردو|شرمین عبید چنائے}}'),
            '{{به عربی|ي ك ى}} {{عربی|ي ك ى}} {{عبارت عربی|ي ك ى}} {{اردو|شرمین عبید چنائے}} {{به اردو|شرمین عبید چنائے}}',
            'عدم تغییر محتویات {{به عربی}} و {{به اردو}}'
        );
        assert.equal(
            f('{{شروع عربی}}\nمك عربي مك عربي\n{{پایان عربی}}'),
            '{{شروع عربی}}\nمك عربي مك عربي\n{{پایان عربی}}',
            'تغییر ندادن متن عربی چند سطری'
        );
        assert.equal(
            f('يييي\nتصویر:ككك.jpg\n[[Image:ككك.png|ي]]'),
            'یییی\nتصویر:ككك.jpg\n[[Image:ككك.png|ی]]',
            'تغییردادن توضیح پرونده و تغییر ندادن نام پرونده'
        );
        assert.equal(
            f('ك ڪ ﻙ ﻚ ي ى ۍ ې ہ ە ھ'),
            'ک ک ک ک ی ی ی ی ه ه\u200c ه',
            'اصلاح کاراکترهای غیرفارسی (ک ی ه) از (عربی، اردو، پشتو، اویغور، کردی) به فارسی مشابه'
        );
    });

    test('persianWikiTools.wikitranslateEnMonthn', function (assert) {
        var f = persianWikiTools.wikitranslateEnMonth;
        assert.equal(
            f("{{birth-date and age|26 March 1933}}"),
            "{{birth-date and age|26 March 1933}}",
            'ترجمه‌کردن تاریخ داخل الگوهایی که انگلیسی هستند (مثل اینجا) معمولاً اشتباه است.'
        );
        assert.equal(
            f("{{start-date|df=yes|15 September 2016}}"),
            "{{start-date|df=yes|15 September 2016}}",
            'ترجمه‌کردن تاریخ داخل الگوهایی که انگلیسی هستند (مثل اینجا) معمولاً اشتباه است.'
        );
        assert.equal(
            f("[[پرونده:Persepolis 24.11.2009 11-32-18.jpg|بندانگشتی|نقش سرو بر [[سنگ‌نگاره]]‌های [[تخت جمشید]]]]"),
            "[[پرونده:Persepolis 24.11.2009 11-32-18.jpg|بندانگشتی|نقش سرو بر [[سنگ‌نگاره]]‌های [[تخت جمشید]]]]",
            'عدم تغییر در عنوان پرونده'
        );
        assert.equal(
            f("متن ۱۲مارس متن\ntext 12March text"),
            "متن ۱۲ مارس متن\ntext 12 March text",
            'افزودن فاصله میان عدد فارسی و ماه'
        );
        assert.equal(
            f("تست July 28, 1973 تست"),
            "تست ۲۸ ژوئیه ۱۹۷۳ تست",
            'ترجمه تاریخ میلادی درون متن ۱'
        );
        assert.equal(
            f('{{یادکرد\n|accessdate= May 3, 2010\n}}\n{{cite book\n| year = 1993\n}}\n{{Citejournal\n| volume      = 34\n}}\n{{Citation\n| volume      = 34\n}}'),
            '{{یادکرد\n|accessdate= May 3, 2010\n}}\n{{cite book\n| year = 1993\n}}\n{{Citejournal\n| volume      = 34\n}}\n{{Citation\n| volume      = 34\n}}',
            'عدم تغییر در الگوی یادکرد , cite'
        );
        assert.equal(
            f("تست جولای ۲۰, ۱۹۹۹ تست"),
            "تست ۲۰ ژوئیه ۱۹۹۹ تست",
            'ترجمه تاریخ میلادی درون متن ۱'
        );
        assert.equal(
            f("تست 2 sep 1999 تست"),
            "تست ۲ سپتامبر ۱۹۹۹ تست",
            'ترجمه تاریخ میلادی درون متن ۲'
        );
        assert.equal(
            f("[[file:2 sep 1999.jpg]]"),
            "[[file:2 sep 1999.jpg]]",
            'عدم ترجمه تاریخ میلادی درون پرونده'
        );
        assert.equal(
            f("|تصویر=Iran Talks Vienna 14 July 2015 (19067069963).jpg"),
            "|تصویر=Iran Talks Vienna 14 July 2015 (19067069963).jpg",
            'عدم ترجمه تاریخ میلادی درون نام پرونده'
        );
        assert.equal(
            f("{{یادکرد دانشنامه|نام خانوادگی=Poonawala |نام=Ismail |بازبینی=21 March 2012}}"),
            "{{یادکرد دانشنامه|نام خانوادگی=Poonawala |نام=Ismail |بازبینی=21 March 2012}}",
            'عدم ترجمه تاریخ میلادی درون یادکرد'
        );
        assert.equal(
            f("today is 4 may 2015.\ntoday is 4 may 2015 and foo\nامروز 4 may 2015 است."),
            "today is 4 may 2015.\ntoday is 4 may 2015 and foo\nامروز ۴ مه ۲۰۱۵ است.",
            'عدم ترجمه تاریخ میلادی درون متن لاتین'
        );
    });

    test('persianWikiTools.wikiPunctuation', function (assert) {
        var f = persianWikiTools.wikiPunctuation;
        assert.equal(
            f('متن <!--متن، --> متن'),
            'متن <!--متن، --> متن',
            'دو خط تیره بعد از کامای فارسی حذف نشود'
        );
        assert.equal(
            f("asdasd\n[[رده:asdasd ]]\n\nsdsad"),
            "asdasd\n[[رده:asdasd]]\n\nsdsad",
            'حذف فاصله داخل ویکی‌پیوند'
        );
        assert.equal(
            f("asdasd\n[[رده:asdasd| ]]\n\nsdsad"),
            "asdasd\n[[رده:asdasd| ]]\n\nsdsad",
            'عدم حذف فاصله در ترتیب رده'
        );
        assert.equal(
            f("[[file:foo.jpg|100px|<small>for test [[text]] for test</small>]]\n[[File:foo.jpg|100px|<small>for test <small>[[text]]</small> for test]]"),
            "[[file:foo.jpg|100px|for test [[text]] for test]]\n[[File:foo.jpg|100px|for test [[text]] for test]]",
            'حذف برچسب کوچک درون توضیحات پرونده'
        );
        assert.equal(
            f("تست\n۱233.متن\n۲.متن\n۳. متن\nتست\n*۱.متن\n*۲.متن\n*۳. متن\nپاراگراف بعد\n۱) متن\n\n۲) متن\n۳) متن\nپاراگراف بعد\n1- متن\n2- متن\n3- متن\nپاراگراف بعد\n۴.متن\nعدم تغییر\n1.1.1- متن\n1.2.3- متن\n3.4- متن\nپاراگراف بعد\n۱-متن ۲-متن۳-متن\n۴-متن\nپارگراف بعد\nتست"),
            "تست\n۱233. متن\n# متن\n# متن\nتست\n# متن\n# متن\n# متن\nپاراگراف بعد\n# متن\n# متن\n# متن\nپاراگراف بعد\n# متن\n# متن\n# متن\nپاراگراف بعد\n۴. متن\nعدم تغییر\n1.1.1- متن\n1.2.3- متن\n3.4- متن\nپاراگراف بعد\n۱-متن ۲-متن۳-متن\n۴-متن\nپارگراف بعد\nتست",
            'تبدیل بندهای ترتیبی به قالب‌بندی ویکی'
        );
        assert.equal(
            f("شابک ۶-۵۶-۶۵۵۶-۹۶۴"),
            "شابک ۶-۵۶-۶۵۵۶-۹۶۴",
            'خط تیره در شابک را تغییر ندهد (۲)'
        );
        assert.equal(
            f("of_Tama\n[https://toolforge.org/project=fawiki=1 this]\n[https://toolforge.org/project=fawiki=1\n\n this]\n\nمتن\n[https://toolforge.org/project=fawiki=1\n\n{{متن}}[[:کتاب]]"),
            "of_Tama\n[https://toolforge.org/project=fawiki=1 this]\n[https://toolforge.org/project=fawiki=1 this]\n\nمتن\n[https://toolforge.org/project=fawiki=1\n\n{{متن}}[[:کتاب]]",
            'حذف \\n از پیوند به بیرون'
        );
        assert.equal(
            f("<ref>[www.example.com]\n|<ref> [www.example.com]\n|<ref> www.example.com\n[[ https://www.example]]\n|<ref name='joi'>[www."),
            "<ref>[http://www.example.com]\n|<ref>[http://www.example.com]\n|<ref>http://www.example.com\n[https://www.example]\n|<ref name='joi'>[http://www.",
            'اصلاح پیوند به بیرون'
        );
        assert.equal(
            f('تخت آهنی<ref group="و" name="iron_throne">Iron Throne</ref> پادشاهی هفت اقلیم<ref group="و" name="seven_kingdoms">Seven Kingdoms</ref> مربوط می‌شود.'),
            'تخت آهنی<ref group="و" name="iron_throne">Iron Throne</ref> پادشاهی هفت اقلیم<ref group="و" name="seven_kingdoms">Seven Kingdoms</ref> مربوط می‌شود.',
            'عدم تغییر گیومه درون رفرنس'
        );
        assert.equal(
            f("شابک ۰-۰۲۰۹-۰۸-۹۶۴-۹۷۸ شابک"),
            "شابک ۰-۰۲۰۹-۰۸-۹۶۴-۹۷۸ شابک",
            'خط تیره در شابک را تغییر ندهد (۱)'
        );
        assert.equal(
            f("۲۰۱۵-۰۲-۰۱"),
            "۲۰۱۵-۰۲-۰۱",
            'قالب تاریخ ایزو را خراب نکند.'
        );
        assert.equal(
            f("متن\n == ==\nمتن"),
            "متن\n\nمتن",
            'حذف زیربخشی که عنوان ندارد'
        );
        assert.equal(
            f("{{پانویس|۲|پانویس‌ها=\n<ref>فیش</ref>\n<ref>فیش</ref>"),
            "{{پانویس|۲|پانویس‌ها=\n<ref>فیش</ref>\n<ref>فیش</ref>",
            'فاصلهٔ درون پانویس درون پانویس‌ها را از بین نبر'
        );
        assert.equal(
            f("تیم آ.ث. میلان و آ. ث. در ایتالیاست.دی.سی. متن [[جان رونالد روئل تالکین|جی. آر. آر. تالکین]]"),
            "تیم آ.ث. میلان و آ.ث. در ایتالیاست. دی.سی. متن [[جان رونالد روئل تالکین|جی.آر.آر. تالکین]]",
            'عدم تغییر کلمات مختصر دارای نقطه'
        );
        assert.equal(
            f("'''راجر فدرر'''{{به فرانسوی|Roger Federer}} ("),
            "'''راجر فدرر''' {{به فرانسوی|Roger Federer}} (",
            'قرار دادن فاصله ابتدای مقاله قبل از به زبان دیگر'
        );
        assert.equal(
            f('ایران ,عده و متن.۱۲ سال و متن؟  متن,متن و متن;متن'),
            'ایران، عده و متن. ۱۲ سال و متن؟ متن، متن و متن؛ متن',
            'اصلاح فاصلهٔ بعد از سجاوندی همراه با تبدیل و حذف دو فاصله بعد از سجاوندی'
        );
        assert.equal(
            f('[[تگزاس اینسترومنتس]],[[اتمل]],[[سیسکو سیستمز]]'),
            '[[تگزاس اینسترومنتس]]، [[اتمل]]، [[سیسکو سیستمز]]',
            'اصلاج ویرگول در میان براکت'
        );
        assert.equal(
            f('متن کتاب(ها) متن کتاب (ها) متن'),
            'متن کتاب(ها) متن کتاب(ها) متن',
            'چسباندن (ها) به کلمهٔ پیشین'
        );
        assert.equal(
            f('متن\n*\nمتن'),
            'متن\n*متن',
            'اصلاح خط اضافی بعد از ستاره'
        );
        assert.equal(
            f('متن{{سخ}}\n\nمتن'),
            'متن\n\nمتن',
            'اصلاح {{سخ}} اضافی'
        );
        assert.equal(
            f('متن\n*==تست==\nمتن'),
            'متن\n\n== تست ==\nمتن',
            'اصلاح خطای ظاهری'
        );
        assert.equal(
            f('متن [[تست۱]]،[[تست۲]](درون پرانتز)،[[انعکاس]]،(درون پرانتز) [[تست۵]][[تست۶]]ام متن'),
            'متن [[تست۱]]، [[تست۲]] (درون پرانتز)، [[انعکاس]]، (درون پرانتز) [[تست۵]][[تست۶]]ام متن',
            'اصلاح سجاوندی در زمانی که [] و () و «» در مقاله باشد'
        );
        assert.equal(
            f('متن .<ref>منبع</ref>'),
            'متن.<ref>منبع</ref>',
            'نقطهٔ پیش از ارجاع را به متن بچسباند.'
        );
        assert.equal(
            f('سال ۱۳۷۰-۱۳۷۵ و سال ۱۳۷۰ــ۱۳۷۵ و سال ۱۳۷۰__۱۳۷۵ متن'),
'سال ۱۳۷۰–۱۳۷۵ و سال ۱۳۷۰–۱۳۷۵ و سال ۱۳۷۰–۱۳۷۵ متن',
            'تبدیل نیم‌خط به تمام خط در میان اعداد فارسی'
        );
        /*assert.equal(
            f("متن\n\n'''عنوان'''\n\nمتن"),
            'متن\n\n== عنوان ==\n\nمتن',
            'تبدیل متن پررنگ شده به عنوان بخش ۱'
        );
        assert.equal(
            f("متن\n\n'''عنوان'''\n* متن"),
            'متن\n\n== عنوان ==\n* متن',
            'تبدیل متن پررنگ شده به عنوان بخش ۲'
        );
        assert.equal(
            f("متن\n\n'''عنوان'''{{سخ}}\nمتن"),
            'متن\n\n== عنوان ==\n\nمتن',
            'تبدیل متن پررنگ شده به عنوان بخش ۳'
        );*/
        assert.equal(
            f('متن {{ متن }} متن'),
            'متن {{متن}} متن',
            'برداشتن فاصلهٔ نالازم درون الگو'
        );
        assert.equal(
            f('مرکزیت [[بیت‌المقدس شرقی]]و با مرزهای'),
            'مرکزیت [[بیت‌المقدس شرقی]] و با مرزهای',
            'جدا کردن واو+فاصله از براکت'
        );
        assert.equal(
            f('{{پانویس|چپ‌چین=بله|اندازه=کوچک}}\n\n{{ترتیب‌پیش‌فرض: رز، آلبرت}}\n\n[' + '[رده:اعضای پیوسته انجمن مهندسان برق و الکترونیک]]'),
            '{{پانویس|چپ‌چین=بله|اندازه=کوچک}}\n\n{{ترتیب‌پیش‌فرض:رز، آلبرت}}\n[' + '[رده:اعضای پیوسته انجمن مهندسان برق و الکترونیک]]',
            'حذف فاصلهٔ ابتدای ترتیب‌پیش‌فرض'
        );
        assert.equal(
            f('تست\n{{DEFAULTSORT: رز، آلبرت}}\nتست'),
            'تست\n{{ترتیب‌پیش‌فرض:رز، آلبرت}}\nتست',
            'ترجمهٔ ترتیب‌پیش‌فرض'
        );
        assert.equal(
            f('تست\n{{DEFAULTSORT:test}}\nتست'),
            'تست\nتست',
            'حذف DEFAULTSORT لاتین'
        );
        assert.equal(
            f('متن<ref>منبع</ref>: «گفتاورد»'),
            'متن:<ref>منبع</ref> «گفتاورد»',
            'ارجاع را به بعد از دونقطه منتقل کند.'
        );
        assert.equal(
            f('|پارامتر     =    مقدار'),
            '|پارامتر     = مقدار',
            'فاصلهٔ بین نام پارامتر و مساوی را حذف نکند — برای زیبایی و ساده‌خواندن است.'
        );
        assert.equal(
            f('متن    [[لینک]]    متن      متن'),
            'متن [[لینک]] متن متن',
            'فاصله‌های اضافی درون متن‌ها را حذف کند.'
        );
        assert.equal(
            f('سلام.<ref>test</ref>. متن'),
            'سلام.<ref>test</ref> متن',
            'اگر پیش از ارجاع نقطه وجود دارد، نقطهٔ تکراری پس از ارجاع حذف شود'
        );
        assert.equal(
            f('می‌روند .'),
            'می‌روند.',
            'نقطهٔ پایانی را به جملهٔ پیش از خود بچسباند.'
        );
        assert.equal(
            f('[[کتاب ]] اول'),
            '[[کتاب]] اول',
            'متنی که پیش از اجرای ابرابزار در ویکی درست نمایش داده می‌شده است نباید پس از آن به هم بچسبد.'
        );
        assert.equal(
            f('== سدها ==\n<ref>منبع</ref>'),
            '== سدها ==\n<ref>منبع</ref>',
            'منبع را به عنوان سطر قبل نچسباند زیرا عنوان خراب می‌شود.'
        );
        assert.equal(
            f('جمله [[تس۲ت|تست]] جمله بعدی'),
            'جمله [[تس۲ت|تست]] جمله بعدی',
            'عدم چابجایی پایپ درون پیوندها'
        );
        assert.equal(
            f('کشور "[[ایران]]" در خاورمیانه است.'),
            'کشور «[[ایران]]» در خاورمیانه است.',
            'اصلاح گیومه در صورتی که عبارت فارسی میان [[]] باشد.'
        );
        assert.equal(
            f('فلانی "چنین گفت."\n\nمتن'),
            'فلانی «چنین گفت.»\n\nمتن',
            'اصلاح گیومه زمانی که آخر پاراگراف باشد'
        );
        assert.equal(
            f('متن "درون گیومه" متن\n\nمتن ‘درون گیومه’ متن\n\nمتن “درون گیومه” متن\n\nمتن ‚درون گیومه’ متن\n\nمتن „درون گیومه” متن\n\nمتن'),
            'متن «درون گیومه» متن\n\nمتن «درون گیومه» متن\n\nمتن «درون گیومه» متن\n\nمتن «درون گیومه» متن\n\nمتن «درون گیومه» متن\n\nمتن',
            'اصلاح انواع شکل‌های گیومه'
        );
        assert.equal(
            f('== «ادعا کرد»، «مدعی شد» =='),
            '== «ادعا کرد»، «مدعی شد» ==',
            'حذف نادرست گیومه از عنوان‌ها.'
        );
        assert.equal(
            f('اندیس "mohsen" و "ali" استفاده'),
            'اندیس "mohsen" و "ali" استفاده',
            'اشتباه در تبدیل گیومه‌ها (یا همه را «» کند یا تغییری ندهد).'
        );
        assert.equal(
            f('{{پات|گروه="ی"|سلام "دنیای" عزیز}}'),
            '{{پات|گروه="ی"|سلام "دنیای" عزیز}}',
            'عدم تغییر گیومه زمانی که نمی تواند آن را کامل تبدیل کند'
        );
        assert.equal(
            f("در خود فرو می‌روی ابدی،\n:از خود می‌پروازی ابدی،\n:رخشندگی همهٔ ژرفاها،"),
            "در خود فرو می‌روی ابدی،\n:از خود می‌پروازی ابدی،\n:رخشندگی همهٔ ژرفاها،",
            'عدم حذف : اول خط یا بیت شعر'
        );
        assert.equal(
            f("<source lang=\"csharp\">\n*whatever\n</source>"),
            "<source lang=\"csharp\">\n*whatever\n</source>",
            'به داخل تگ سورس کاری نداشته باشد.'
        );
        assert.equal(
            f("<blockquote>«رایانش»</blockquote>"),
            "<blockquote>«رایانش»</blockquote>",
            'بین تگ گفتاورد و گیومه فاصله نگذارد.'
        );
        assert.equal(
            f("کارساز (سرور)ها"),
            "کارساز (سرور)ها",
            'بین پرانتز و «ها» فاصله نگذارد یا اینکه ها را به داخل پرانتز منتقل کند.'
        );
        assert.equal(
            f("==== عنوان<ref group=\"گروه\">Client</ref> ===="),
            "==== عنوان<ref group=\"گروه\">Client</ref> ====",
            'بین مساوی‌های به هم چسبیدهٔ عنوان فاصله‌گذاری نادرست نکند.'
        );
        assert.equal(
            f("'''برون‌یابی، پیش‌بینی و «تاریخ آینده»'''"),
            "'''برون‌یابی، پیش‌بینی و «تاریخ آینده»'''",
            'افزودن فاصله بین گیومه و \' نادرست است.'
        );
        assert.equal(
            f('آمازون.کام'),
            'آمازون.کام',
            'اسم وب‌گاه را تغییر ندهد.'
        );
        assert.equal(
            f('متن.\n:متن'),
            'متن.\n:متن',
            'در خط بعد دو نقطه خرابکاری نکند'
        );
        assert.equal(
            f('متن۱؛\nمتن۲'),
            'متن۱؛\nمتن۲',
            'شکستن یک متن با یک خط ممکن است عمدی — مثلاً برای خوانایی بیهتر در حالت ویرایش یا گرفتن تفاوت بهتر — باشد و شکستگی نباید حذف شود، نرم‌افزار خودش کنار هم می‌آورد.'
        );
        assert.equal(
            f('سلام،\n\nمتن'),
            'سلام،\n\nمتن',
            'آمدن ویرگول در پایان سطر اول یک پیام رایج است.'
        );
        assert.equal(
            f('«است؟!»'),
            '«است؟!»',
            'علامت سؤال می‌تواند پیش یا پس از علامت تعجب بیاید.'
        );
        assert.equal(
            f('علی, احمد و حسن آمدند.\ntest, test'),
            'علی، احمد و حسن آمدند.\ntest, test',
            'تبدیل ویرگول لاتین به فارسی'
        );
        assert.equal(
            f('[[علی]], احمد و حسن آمدند.\nA [[test]], test'),
            '[[علی]]، احمد و حسن آمدند.\nA [[test]], test',
            'تبدیل ویرگول لاتین به فارسی حتی برای بین پیوندهای فارسی'
        );
        assert.equal(
            f('[[علی]], [[احمد]] آمدند.'),
            '[[علی]]، [[احمد]] آمدند.',
            'تبدیل ویرگول لاتین بین پیوندهای فارسی'
        );
        assert.equal(
            f('=== <small>گرایش مهندسی صنایع</small> ==='),
            '=== گرایش مهندسی صنایع ===',
            'حذف تگ از داخل عنوان.'
        );
        assert.equal(
            f('[[پرونده:مثال.jpg|«توضیح»]]'),
            '[[پرونده:مثال.jpg|«توضیح»]]',
            'نیافزودن فاصله قبل از گیومه در بخش توضیحات پرونده'
        );
        assert.equal(
            f('متن\n«برای تست«تست'),
            'متن\n«برای تست «تست',
            'نیافزودن فاصله قبل از گیومه در ابتدای خط'
        );
        assert.equal(
            f('<ref name="آبا" />'),
            '<ref name="آبا"/>',
            'عدم تغییر گیومه لاتین درون رفرنس که بعد از الف باشد'
        );
        assert.equal(
            f('تست مثلا" تست است'),
            'تست مثلاً تست است',
            'جایگزینی گیومهٔ لاتین با تنوین در میان متن فارسی'
        );
        assert.equal(
            f('تست مثلا” تست است'),
            'تست مثلاً تست است',
            'جایگزینی گیومهٔ لاتین ۲ با تنوین در میان متن فارسی'
        );
        assert.equal(
            f('او گفت "من می‌روم" ولی نرفت.\nاو گفت "من می‌روم"\nاو گفت "من می‌روم".\nتست'),
            'او گفت «من می‌روم» ولی نرفت.\nاو گفت «من می‌روم»\nاو گفت «من می‌روم».\nتست',
            'جایگزینی گیومهٔ لاتین " " با گیومهٔ فارسی'
        );
        assert.equal(
            f('او گفت “من می‌روم” ولی نرفت.\nاو گفت “من می‌روم”\nاو گفت “من می‌روم”.\nتست “test” برای تست'),
            'او گفت «من می‌روم» ولی نرفت.\nاو گفت «من می‌روم»\nاو گفت «من می‌روم».\nتست “test” برای تست',
            'جایگزینی گیومهٔ لاتین ” “ با گیومهٔ فارسی'
        );
        assert.equal(
            f('"شیراز"و "اصفهان" شهرهای ایران هستند.\n\n"شیراز" و "اصفهان" شهرهای ایران هستند.\nشهرهای "شیراز"و "اصفهان" در ایران هستند.\n\nوی به گفت "جمله تست\n\nادامه تست" چنین است\n\nشهرهای "شیراز".\n\nشهرهای "شیراز"،\nاصفهان" در ایران هستند.\n\nتست<ref name="تست">\n\nشهر شیراز" و "اصفهان" در ایران هستند<ref name="تست">'),
            '«شیراز» و «اصفهان» شهرهای ایران هستند.\n\n«شیراز» و «اصفهان» شهرهای ایران هستند.\nشهرهای «شیراز» و «اصفهان» در ایران هستند.\n\nوی به گفت "جمله تست\n\nادامه تست" چنین است\n\nشهرهای «شیراز».\n\nشهرهای "شیراز"،\nاصفهان" در ایران هستند.\n\nتست<ref name="تست">شهر شیراز" و "اصفهان" در ایران هستند<ref name="تست">',
            'جایگزینی گیومهٔ لاتین با گیومهٔ فارسی زمانی که تعداد گیومه‌ها زوج یا فرد باشند'
        );
        /*assert.equal(
            f('علی گفت "من\nبا وسایلم می‌روم" اما نرفت.\n\n"تست" است'),
            'علی گفت «من\nبا وسایلم می‌روم» اما نرفت.\n\n«تست» است',
            'گیومه اگر در دو خط پشت سرهم بود آن را نیز تبدیل کند.'
        );*/
        assert.equal(
            f('«نیم‌جمله،»'),
            '«نیم‌جمله،»',
            'ویرگول پایان جمله همیشه نباید به بیرون از علامت نقل قول منتقل شود. MOS:LQ'
        );
        assert.equal(
            f('«جمله.»'),
            '«جمله.»',
            'نقطهٔ پایان جمله همیشه نباید به بیرون از علامت نقل قول منتقل شود. MOS:LQ'
        );
        assert.equal(
            f('این یک جمله است.این یک [[جمله.جمله]] است'),
            'این یک جمله است. این یک [[جمله.جمله]] است',
            'تغییر ندادن نقطه درون پیوند ویکی'
        );
        assert.equal(
            f('|سبک(ها)=\nمدیر(ان)'),
            '|سبک(ها)=\nمدیر(ان)',
            'جداکردن علامت جمع داخل پرانتز از کلمهٔ پیش از آن درست نیست (در پارامتر الگوها زیاد دیده می‌شود)'
        );
        assert.equal(
            f('متن.\n\n== منابع ==\n<references/>'),
            'متن.\n\n== منابع ==\n<references/>',
            'تگ references را به خط قبلی‌ نچسباند'
        );
        assert.equal(
            f('متن\n	 s == A<sub>i</sub>\n\n== عنوان بخش =='),
            'متن\n	 s == A<sub>i</sub>\n\n== عنوان بخش ==',
            'فاصلهٔ بین عنوان بخش بعدی و کد قبل از آن را حفظ کند'
        );
        assert.equal(
            f("متن\n\n== برچسب‌زدن حسابهای جایگزین ''مشروع'' ==\nمتن"),
            "متن\n\n== برچسب‌زدن حسابهای جایگزین ''مشروع'' ==\nمتن",
            'تأکیدها از عنوان بخش حذف نشوند'
        );
        assert.equal(
            f('== «دانشنامهٔ آزاد» به معنی «دانشنامهٔ رایگان» نیست =='),
            '== «دانشنامهٔ آزاد» به معنی «دانشنامهٔ رایگان» نیست ==',
            'حذف نادرست یک گیومه'
        );
        assert.equal(
            f('== «متن»  =='),
            '== متن ==',
            'یکی از گیومه‌های داخل عنوان حذف می‌شود اما دیگری نه'
        );
        assert.equal(
            f('و . . . را.'),
            'و . . . را.',
            'برابر با شیوه‌نامه شیکاگو بین نقطه‌های سه‌نقطه باید فاصله باشد'
        );
        assert.equal(
            f('[[رده:رده\u200cها]]'),
            '[[رده:رده\u200cها]]',
            'نیفزودن فاصله بعد از دو نقطه'
        );
        assert.equal(
            f('# تست۱\n# تست۲\n\n# تست۳'),
            '# تست۱\n# تست۲\n# تست۳',
            'حذف خط اضافه میان # ها'
        );
        assert.equal(
            f('قبل\n\n== متن عنوان ==\n\nبعد'),
            'قبل\n\n== متن عنوان ==\n\nبعد',
            'اصلاحات سجاوندی: فاصله بین دستور و متن عنوان'
        );
        assert.equal(
            f('<ref name="تست"/>'),
            '<ref name="تست"/>',
            'عدم تغییر گیومهٔ درون ارجاع'
        );
        assert.equal(
            f('سجاوندی . سجاوندی ، سجاوندی ؛ سجاوندی, سجاوندی , سجاوندی ، سجاوندی'),
            'سجاوندی. سجاوندی، سجاوندی؛ سجاوندی، سجاوندی، سجاوندی، سجاوندی',
            'اصلاحات سجاوندی: نقطه، کاما، نقطه\u200cکاما'
        );
        assert.equal(
            f('متن(فارسی) من - متن( فارسی ) من - متن ( فارسی ) من'),
            'متن (فارسی) من - متن (فارسی) من - متن (فارسی) من',
            'اصلاحات سجاوندی: پرانتز در متن فارسی'
        );
        assert.equal(
            f('قبل\n* متن\n\n* متن\nبعد'),
            'قبل\n* متن\n* متن\nبعد',
            'اصلاحات سجاوندی: حذف فاصله بین فهرست\u200cهای گلوله\u200cای و متن قبلشان'
        );
        assert.equal(
            f('ارجاع\n<ref>منبع</ref>'),
            'ارجاع<ref>منبع</ref>',
            'فاصلهٔ ارجاع و ref حذف شود'
        );
        assert.equal(
            f('تست\n\n\n\n\nتست'),
            'تست\n\nتست',
            'حذف خطوط اضافه'
        );
        assert.equal(
            f('# تغییر مسیر[[فلان]]'),
            '#تغییرمسیر [[فلان]]',
            'اصلاح دستور تغییرمسیر'
        );
        assert.equal(
            f('# تغییر_مسیر[[فلان]]'),
            '#تغییرمسیر [[فلان]]',
            'اصلاح دستور تغییرمسیر'
        );
        assert.equal(
            f('فلان.ایران . ما\n[' + '[رده:چنین]]\n[' + '[رده: چنان]]\n[[الگو: چنان]]\n[[ویکی\u200cپدیا: چنان]]\n[[الگو:چنین]]\n[[ویکی\u200cپدیا:چنین]]'),
            'فلان. ایران. ما\n[' + '[رده:چنین]]\n[' + '[رده:چنان]]\n\n[[الگو:چنان]]\n[[ویکی\u200cپدیا:چنان]]\n[[الگو:چنین]]\n[[ویکی\u200cپدیا:چنین]]',
            'اصلاحات سجاوندی: فاصله بعد از دونقطه در رده\u200c، الگو، ویکی\u200cپدیا'
        );
        assert.equal(
            f('<!-- === پسوندها نام گذاری == -->'),
            '<!-- === پسوندها نام گذاری == -->',
            'اصلاحات سجاوندی: دست نزدن به دستور &lt;!-- اچ\u200cتی\u200cام\u200cال'
        );
        assert.equal(
            f('\nبرای تست \n\n'),
            'برای تست',
            'حذف کردن \\n و \\r از ابتدا و انتهای متن'
        );
        assert.equal(
            f('[[پرونده: علیآباد.jpg]]'),
            '[[پرونده: علیآباد.jpg]]',
            'اصلاحات سجاوندی عدم حذف فاصله بعد از پرونده'
        );
        assert.equal(
            f('متن <ref>{{یادکرد|فلان=بهمان.|چنین= چنان}}</ref>.'),
            'متن.<ref>{{یادکرد|فلان=بهمان.|چنین= چنان}}</ref>',
            'اصلاحات سجاوندی: نقطه قبل از یادکرد'
        );
        assert.equal(
            f('متن<ref>[یادکرد<sup>۲</sup><!-- عنوان تصحیح شده توسط ربات -->]</ref>، ادامه'),
            'متن،<ref>[یادکرد<sup>۲</sup><!-- عنوان تصحیح شده توسط ربات -->]</ref> ادامه',
            'ویرگول پیش از یادکرد قرار گیرد'
        );
        assert.equal(
            f('<ref>منبع ۱</ref><ref>منبع ۲</ref> متن بیرون <ref>منبع ۳</ref>.'),
            '<ref>منبع ۱</ref><ref>منبع ۲</ref> متن بیرون.<ref>منبع ۳</ref>',
            'نقطه باید به پشت نزدیک‌ترین تگ ref منتقل شود'
        );
        assert.equal(
            f('متن (\u200c'),
            'متن (\u200c',
            'اصلاح نیم\u200cفاصله:قبل و بعد از پرانتز'
        );
        assert.equal(
            f('*   متن\n#    متن'),
            '* متن\n# متن',
            'حذف فاصلهٔ اضافی بعد از * و #'
        );
        assert.equal(
            f('⬤ متن\n⚫ متن\n● متن'),
            '* متن\n* متن\n* متن',
            'تبدیل دایره توپر اول خط به *'
        );
        assert.equal(
            f('قرمـــــــــز'),
            'قرمز',
            'حذف نویسهٔ کشیدگی کلمات'
        );
        assert.equal(
            f('شسیشسی [[سشیشس میـد]] شسیشسی'),
            'شسیشسی [[سشیشس مید]] شسیشسی',
            'حذف کشیده داخل پیوند'
        );
        assert.equal(
            f('تست و....'),
            'تست و…',
            'تبدیل ۴ نقطه به نویسهٔ سه نقطه'
        );
        assert.equal(
            f('متن.؛ متن.! متن.؟ متن.، متن.:'),
            'متن. متن. متن. متن. متن.',
            'بعد از نقطه (؛-:!؟) نمی‌آید'
        );
        assert.equal(
            f('متن۱ (.شروع متن\nمتن۲ (؛شروع متن\nمتن۳ (،شروع متن'),
            'متن۱ (شروع متن\nمتن۲ (شروع متن\nمتن۳ (شروع متن',
            'سجاوندی بعد از پرانتز باز نمی‌آید'
        );
        assert.equal(
            f('متن،) پایان\n متن.) پایان\n متن؛) پایان'),
            'متن) پایان\n متن) پایان\n متن) پایان',
            'سجاوندی قبل از پرانتز بسته نمی‌آید'
        );
        assert.equal(
            f('تست؛،'),
            'تست؛',
            'بعد از نقطه‌ویرگول نباید علامتی باشد'
        );
        assert.equal(
            f('! style="background: #CCC;" class="unsortable" scope="col" width="200px"|جزیره!!style="background: #CCC;" class="unsortable"| مرکز! !style="background: #CCC;"'),
            '! style="background: #CCC;" class="unsortable" scope="col" width="200px"|جزیره!!style="background: #CCC;" class="unsortable"| مرکز! !style="background: #CCC;"',
            'خراب نکردن متن درون جدول‌ها'
        );
        assert.equal(
            f('انتهای پاراگراف؛\n\nشروع خط جدید'),
            'انتهای پاراگراف.\n\nشروع خط جدید',
            'نقطه‌ویرگول انتهای خط نمی‌آید'
        );
        assert.equal(
            f('متن،. متن،؛ متن،- متن،. متن،! متن،؟'),
            'متن، متن، متن، متن، متن، متن،',
            'بعد از ویرگول (.؛-!؟) نمی‌آید'
        );
        assert.equal(
            f('متن. زیرا متن. یعنی متن. بنابراین متن. لذا'),
            'متن؛ زیرا متن؛ یعنی متن؛ بنابراین متن؛ لذا',
            'قبل از واژهٔ توضیحی . نمی‌آید'
        );
        assert.equal(//چون !! در کدهای مدیاویکی استفاده می‌شود علامت تعجب را به این موارد نیافزائید
            f('متن،، متن؛؛ متن؟؟؟'),
            'متن، متن؛ متن؟',
            'تکرار سجاوندی یکسان'
        );
        assert.equal(
            f('متن فارسی? متن فارسی; متن فارسی,'),
            'متن فارسی؟ متن فارسی؛ متن فارسی،',
            'استفاده از سجاوندی فارسی'
        );
        /*assert.equal(//مثال نقض برای کاراکتر فارسی و اعداد «نوکیا ان۹۰»
            f('متنtextمتن'),
            'متن text متن',
            'بین کارکترهای فارسی و انگلیسی فاصله باشد (البته در فضای نام مقاله تا با نام کاربری تعارض نداشته باشد)'
        );*/
        assert.equal(
            f('۱-تست؛ تست تست ؛ تست تست ؛تست تست؛تست ۲-تست. تست تست . تست تست .تست تست.تست ۳-تست، تست تست ، تست تست ،تست تست،تست ۴-تست! تست تست ! تست تست!تست ۵-تست؟ تست تست ؟ تست تست ؟تست تست؟تست ۶-تست« تست تست « تست تست «تست تست«تست ۷-تست» تست تست » تست تست »تست تست»تست ۸-تست( تست تست ( تست تست (تست تست(تست ۹-تست) تست تست ) تست تست )تست تست)تست <nowiki><!-- برای تست --></nowiki>'),
            '۱-تست؛ تست تست؛ تست تست؛ تست تست؛ تست ۲-تست. تست تست. تست تست. تست تست. تست ۳-تست، تست تست، تست تست، تست تست، تست ۴-تست! تست تست! تست تست! تست ۵-تست؟ تست تست؟ تست تست؟ تست تست؟ تست ۶-تست «تست تست «تست تست «تست تست «تست ۷-تست» تست تست» تست تست» تست تست» تست ۸-تست (تست تست (تست تست (تست تست (تست ۹-تست) تست تست) تست تست) تست تست) تست <nowiki><!-- برای تست --></nowiki>',
            'اصلاح فاصله قبل و بعد از سجاوندی'
        );
        assert.equal(
            f('تست [www.example.com]'),
            'تست [www.example.com]',
            'حذف نکردن فاصلهٔ قبل از لینک‌های بیرونی'
        );
        assert.equal(
            f('*;تست تست'),
            '*; تست تست',
            'افزودن فاصله پس از دستور فهرست گلوله‌ای یا دندانه‌ای'
        );
    });

    test('persianWikiTools.wikiTextDigitsToPersian', function (assert) {
        var f = persianWikiTools.wikiTextDigitsToPersian;
        assert.equal(
            f('{{Infobox pandemic\n| photo1a =3408162 بخش ویژه کرونا در بیمارستان هاجر.jpg\n}}'),
            '{{Infobox pandemic\n| photo1a =3408162 بخش ویژه کرونا در بیمارستان هاجر.jpg\n}}',
            'نام پرونده در پارامتر الگو را فارسی نکن'
        );
        assert.equal(
            f('<div style=float:left>{{Graph:Chart\n | x=1,2,3,4,5,6,7,8, 9,10,11\n | y1=.52,.65,.60,.58,.71,.67,.51,.55,.64,.62,.42\n | y2=.55,.67,.56,.57,.72,.73,.58,.60,.66,.68,.48\n}}</div>'),
            '<div style=float:left>{{Graph:Chart\n | x=1,2,3,4,5,6,7,8, 9,10,11\n | y1=.52,.65,.60,.58,.71,.67,.51,.55,.64,.62,.42\n | y2=.55,.67,.56,.57,.72,.73,.58,.60,.66,.68,.48\n}}</div>',
            'عدم تغییر اعداد الگو گراف'
        );
        assert.equal(
            f('{{Graph:Chart\n | x=1,2,3,4,5,6,7,8, 9,10,11\n | y1=.52,.65,.60,.58,.71,.67,.51,.55,.64,.62,.42\n | y2=.55,.67,.56,.57,.72,.73,.58,.60,.66,.68,.48\n}}'),
            '{{Graph:Chart\n | x=1,2,3,4,5,6,7,8, 9,10,11\n | y1=.52,.65,.60,.58,.71,.67,.51,.55,.64,.62,.42\n | y2=.55,.67,.56,.57,.72,.73,.58,.60,.66,.68,.48\n}}',
            'عدم تغییر اعداد الگو گراف'
        );
        assert.equal(
            f('[[پرونده:Hoseyn Maqsudi 1398-03-05.jpg|انگشتی|ایستاده=0.8|.]]'),
            '[[پرونده:Hoseyn Maqsudi 1398-03-05.jpg|انگشتی|ایستاده=0.8|.]]',
            'پارامتر ایستاده در تصاویر را فارسی نکن'
        );
        assert.equal(
            f('٪۱٫۱ متن ٪۱۰٬۹ متن'),
            '۱٫۱٪ متن ۱۰٬۹٪ متن',
            'علامت درصد پیش از عدد رابه پس از آن منتقل کند.'
        );
        assert.equal(
            f('[[رده:عدد گروه آنزیمی ۲.۷.۱]]'),
            '[[رده:عدد گروه آنزیمی ۲.۷.۱]]',
            'عدم تغییر ممیز در رده'
        );
        assert.equal(
            f('{{#expr: 2/{{t}}*1}}'),
            '{{#expr: 2/{{t}}*1}}',
            'اعداد داخل تابع را فارسی نکند.'
        );
        assert.equal(
            f('{{lang-en|WorldView-3}}'),
            '{{lang-en|WorldView-3}}',
            'عدد داخل الگوی انگلیسی را فارسی نکند.'
        );
        assert.equal(
            f('عدد ۱st و عدد ۲th و ۳rd و ۴nd متن'),
            'عدد 1st و عدد 2th و 3rd و 4nd متن',
            'اصلاح عددهای مرتبه‌ای انگلیسی'
        );
        assert.equal(
            f("ISBN:  ۱۲۳-۴\nISBN۱-۲۳۴\nISBN1234\nISBN:1234\nISBN ۱۲۳۴۸۹\nPMID۵۶۴۷\nPubMed۵۶۴۷"),
            "ISBN 123-4\nISBN 1-234\nISBN 1234\nISBN 1234\nISBN 123489\nPMID 5647\nPMID 5647",
            'تبدیل عدد فارسی آی‌اس‌بی‌ان و پاپ‌مد به انگلیسی تبدیل شود'
        );
        assert.equal(
            f("|ISBN-note = text"),
            "|ISBN-note = text",
            'عدم تغییر پارامتر الگو'
        );
        assert.equal(
            f('{{چپ‌چین}}\n  [4, 10, 11, 20, 21, 30, 110, 330]\n{{پایان چپ‌چین}}'),
            '{{چپ‌چین}}\n  [4, 10, 11, 20, 21, 30, 110, 330]\n{{پایان چپ‌چین}}',
            'عدم تغییر در اعداد درون {{چپ‌چین}}'
        );
        assert.equal(
            f('<gallery perrow="3">\n</gallery>'),
            '<gallery perrow="3">\n</gallery>',
            'ارقام متعلقات تگ گالری را تغییر ندهد'
        );
        assert.equal(
            f('{{یادکرد\n|accessdate= May 3, 2010\n}}\n{{cite book\n| year = 1993\n}}\n{{Citejournal\n| volume      = 34\n}}\n{{Citation\n| volume      = 34\n}}'),
            '{{یادکرد\n|accessdate= May 3, 2010\n}}\n{{cite book\n| year = 1993\n}}\n{{Citejournal\n| volume      = 34\n}}\n{{Citation\n| volume      = 34\n}}',
            'عدم تغییر در الگوی یادکرد , cite'
        );
        assert.equal(
            f('[[پرونده:Soosk۱.jpg|انگشتدان|چپ|230px|بخشی از صفحهٔ]]'),
            '[[پرونده:Soosk۱.jpg|انگشتدان|چپ|230px|بخشی از صفحهٔ]]',
            'عدم تغییر عنوان پرونده'
        );
        assert.equal(
            f("Wikipedia contributors, \"Tunnel diode,\" Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Tunnel_diode&oldid=611771583 (accessed September 7, 2014)."),
            "Wikipedia contributors, \"Tunnel diode,\" Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Tunnel_diode&oldid=611771583 (accessed September 7, 2014).",
            'یادکرد ویکی کپی‌شده از ویکی انگلیسی را تغییری ندهد'
        );
        assert.equal(
            f("<ref>http://www.example.com</ref><ref>http://example.com/123123/%D9%85%D9%88</ref>"),
            "<ref>http://www.example.com</ref><ref>http://example.com/123123/%D9%85%D9%88</ref>",
            'اشتباه در تبدیل ارقام'
        );
        assert.equal(
            f("| {{Fb|India}} || '''[[Sunil Chhetri]]''' || 48 || 79 || 0.57"),
            "| {{Fb|India}} || '''[[Sunil Chhetri]]''' || ۴۸ || ۷۹ || ۰٫۵۷",
            'اصلاح عدد میان دو |'
        );
        assert.equal(
            f("از زمان system&#x20;7  استفاده می‌شود"),
            "از زمان system&#x20;7  استفاده می‌شود",
            'عدم تغییر عدد بعد از ; و حروف لاتین'
        );
        assert.equal(
            f("Encyclopedia ۲۰۰۲. ۱۹۹۳–۲۰۰۱ Microsoft Version: ۲۰۰۶٫۰۱٫۰۰٫۰۰۰۰۰۰۰۰۰, Persian Encyclopedia ۲۰۰۲. ۱۹۹۳–۲۰۰۱ Corporation, ۲۰۰۶, Edition. ۲۰۰۸. Encyclopedia.com. ۲۱ Dec. \nfoo۱۲۳foo\nfoo ۱۲۳ foo\nfoo۱۲۳\nfoo\n[[foo]] ۱۲۳ [[foo]]"),
              "Encyclopedia 2002. 1993–2001 Microsoft Version: 2006.01.00.000000000, Persian Encyclopedia 2002. 1993–2001 Corporation, 2006, Edition. 2008. Encyclopedia.com. 21 Dec. \nfoo123foo\nfoo 123 foo\nfoo123\nfoo\n[[foo]] 123 [[foo]]",
            'اصلاح اعداد فارسی درون متن انگلیسی'
        );
        assert.equal(
            f("دمای آن ْ۳۲ در تابستانها و حداقل آن ْ۱۵- در"),
            "دمای آن °۳۲ در تابستانها و حداقل آن °۱۵- در",
            'تبدیل نویسه سکون به نویسه درجه در کنار عدد فارسی'
        );
        assert.equal(
            f("دمای آن°۴۰ در تابستانها و حداقل آن°۳۵- در"),
            "دمای آن °۴۰ در تابستانها و حداقل آن °۳۵- در",
            'فاصله بین نویسه درجه و حروف فارسی'
        );
        assert.equal(
            f("<ref>http://www.example.com</ref><ref>http://example.com/123123/%D9%85%D9%88</ref>"),
            "<ref>http://www.example.com</ref><ref>http://example.com/123123/%D9%85%D9%88</ref>",
            'اشتباه در تبدیل ارقام'
        );
        assert.equal(
            f("<timeline> ImageSize = width:700 height:200 عدد 2 تست</timeline> height:22 تست"),
            "<timeline> ImageSize = width:700 height:200 عدد 2 تست</timeline> height:22 تست",
            'عدم تغییر عدد درون تایم‌لاین و عدم تغییر عدد بعد از height:'
        );
        assert.equal(
            f("۱۲۳،۴۵۶.۷۸ و 123.456"),
            "۱۲۳٬۴۵۶٫۷۸ و ۱۲۳٫۴۵۶",
            'جداکننده ارقام فارسی به جای ویرگول فارسی'
        );
        assert.equal(
            f("*[[دنیس اسپیلبرگ|Spellberg, D.A.]] (1994), ''Politics, Gender, and the Islamic Past: the Legacy of A'isha bint Abi Bakr''"),
            "*[[دنیس اسپیلبرگ|Spellberg, D.A.]] (1994), ''Politics, Gender, and the Islamic Past: the Legacy of A'isha bint Abi Bakr''",
            'عدد سال داخل پرانتز فارسی نشود'
        );
        assert.equal(
            f("فرمول g(x) = x^2 + 2x + 2 است"),
            "فرمول g(x) = x^2 + 2x + 2 است",
            'در این فرمول ریاضی، یا باید همهٔ ارقام فارسی شوند یا همه انگلیسی بمانند'
        );
        assert.equal(
            f("'''while''' (i> 0 '''and''' j> 0)"),
            "'''while''' (i> 0 '''and''' j> 0)",
            'پرهیز از فارسی‌سازی ارقام لابه‌لای دستورهای برنامه‌نویسی'
        );
        assert.equal(
            f('ISBN 0-89791-193-8 1986'),
            'ISBN 0-89791-193-8 1986',
            'پرهیز از فارسی‌سازی ارقام انتهایی در منابع انگلیسی'
        );
        assert.equal(
            f('<font color="99000000"">Text</font>'),
            '<font color="99000000"">Text</font>',
            'پرهیز از فارسی‌سازی رنگ در تگ فونت'
        );
        assert.equal(
            f('دارای "&#61;" است'),
            'دارای "&#61;" است',
            'پرهیز از فارسی‌سازی ارقام هستارهای اچ‌تی‌ام‌ال'
        );
        assert.equal(
            f('D. G. (2000). Community'),
            'D. G. (2000). Community',
            'اگر عدد لابه‌لای متن انگلیسی است، آن را فارسی نکند. (از نمونه‌های دیده‌شده در بخش منابع مقالات)'
        );
        assert.equal(
            f('* {{یادکرد ژورنال|نشانی=http://icb.oxfordjournals.org|doi=10.1093/icb/41.2.154}}'),
            '* {{یادکرد ژورنال|نشانی=http://icb.oxfordjournals.org|doi=10.1093/icb/41.2.154}}',
            'ارقام doi را فارسی نکند.'
        );
        assert.equal(
            f('1928 Winter Olympics'),
            '1928 Winter Olympics',
            'عدد پیش از نوشته‌های انگلیسی را فارسی نکند (برای نمونه در {{ویکی‌انبار-رده|1928 Winter Olympics}} یا «|عنوان = 13714 Stainbrook»)'
        );
        assert.equal(
            f('F\n0/24'),
            'F\n۰/۲۴',
            'ارقامِ خط بعد استثنا نشوند'
        );
        assert.equal(
            f('<font color="#0000FF">'),
            '<font color="#0000FF">',
            'ارقامِ رنگ در تگ‌های فونت را فارسی نکند'
        );
        assert.equal(
            f('{{جعبه اطلاعات روستای ایران\n|نام‌رسمی=مومن آبادبخش مرکزی\n|روی‌نقشه=\n|جمعیت= 990 نفر\n|رشدجمعیت=\n|پیش‌شماره=0252\n}}'),
            '{{جعبه اطلاعات روستای ایران\n|نام‌رسمی=مومن آبادبخش مرکزی\n|روی‌نقشه=\n|جمعیت= ۹۹۰ نفر\n|رشدجمعیت=\n|پیش‌شماره=۰۲۵۲\n}}',
            'اصلاح ارقام بعد از مساوی زمانی که ۳ یا ۶ یا ۸ رقمی باشند.'
        );
        assert.equal(
            f('{{تست|mycolor1= 000fff\n|mycolor2= fff000\n|mycolor3= ff0ff0\n}}'),
            '{{تست|mycolor1= 000fff\n|mycolor2= fff000\n|mycolor3= ff0ff0\n}}',
            'عدم تغییر عدد رنگ اچ‌تی‌ام‌ال زمانی که متغییر باشد'
        );
        assert.equal(
            f('شرکت 3DO بود'),
            'شرکت 3DO بود',
            'ارقام چسبیده و قبل از حروف انگلیسی فارسی نشوند'
        );
        assert.equal(
            f('[[:en:Wikipedia:Arbitration Committee Elections December 2012#Election process|پیوند]]'),
            '[[:en:Wikipedia:Arbitration Committee Elections December 2012#Election process|پیوند]]',
            'اعداد داخل پیوندها به ویکی انگلیسی فارسی نشوند'
        );
        assert.equal(
            f('<h3>متن فارسی<h3>'),
            '<h3>متن فارسی<h3>',
            'شمارهٔ تگ‌های هدر را فارسی نکند'
        );
        assert.equal(
            f('۹ سپتامبر ۲۰۰۸ || [[Jimmy]]{{سخ}}[[Italia 1]]'),
            '۹ سپتامبر ۲۰۰۸ || [[Jimmy]]{{سخ}}[[Italia 1]]',
            'در پیوندهای انگلیسی، اعداد فارسی نشوند'
        );
        assert.equal(
            f('Research, 10:1, 7 – 14. Online'),
            'Research, 10:1, 7 – 14. Online',
            'اعداد لابه‌لای متن انگلیسی، فارسی نشوند'
        );
        assert.equal(
            f('<ref>xyz (accessed July 3, 2013)</ref>'),
            '<ref>xyz (accessed July 3, 2013)</ref>',
            'ارقام تاریخ را فارسی نکند'
        );
        assert.equal(
            f('[[ویژه:مشارکت‌ها/31.59.154.139|31.59.154.139]]'),
            '[[ویژه:مشارکت‌ها/31.59.154.139|31.59.154.139]]',
            'اعداد در امضای آی‌پی‌ها و پیوند مشارکت‌هایشان فارسی نشود'
        );
        assert.equal(
            f(' its components in [[3D modeling|3D]], annotate the'),
            ' its components in [[3D modeling|3D]], annotate the',
            'اعداد در متن انگلیسی تغییری نکند'
        );
        assert.equal(
            f('{{temp|par2=پارامتر2}}'),
            '{{temp|par2=پارامتر۲}}',
            'اعداد در مقدار پارامتر فارسی شوند، اما در نام پارامتر تغییری نکنند'
        );
        assert.equal(
            f('Hassan (1994)'),
            'Hassan (1994)',
            'تبدیل نکردن ارقام داخل پرانتز در متون انگلیسی'
        );
        assert.equal(
            f(
                '{{coord'+'|39|32|52|N|87|22|38|W|type:airport_region:US-IN_scale:10000_source:enwiki|display=title}}'
            ),
            '{{coord'+'|39|32|52|N|87|22|38|W|type:airport_region:US-IN_scale:10000_source:enwiki|display=title}}',
            'عدم تغییر اعداد الگوی مختصات'
        );
        assert.equal(
            f('there are 100,000 samples'),
            'there are 100,000 samples',
            'عدم تغییر عدد لاتین درون متن لاتین'
        );
        assert.equal(
            f('<source lang="rsplus">delay=100</source>'),
            '<source lang="rsplus">delay=100</source>',
            'تغییرندادن ارقام لاتین درون سورس'
        );
        assert.equal(
            f('متن 1370 متن'),
            'متن ۱۳۷۰ متن',
            'تغییر عدد لاتین درون متن فارسی'
        );
        assert.equal(
            f('[[تصویر:test.jpg|چپ|120px|عکسی میلادی]]'),
            '[[تصویر:test.jpg|چپ|120px|عکسی میلادی]]',
            'انگلیسی نگاه داشتن عددهای اندازه تصویر'
        );
        assert.equal(
            f('[[تصویر:test.jpg|چپ|120px|عکسی از 1980 میلادی]]'),
            '[[تصویر:test.jpg|چپ|120px|عکسی از ۱۹۸۰ میلادی]]',
            'فارسی\u200cسازی اعداد توضیحات تصویر'
        );
        assert.equal(
            f('[[file:12 test 123 .jpg|چپ|120px|عکسی]]'),
            '[[file:12 test 123 .jpg|چپ|120px|عکسی]]',
            'عدم تغییر فاصله\u200cها و اعداد درون نام تصویر'
        );
        assert.equal(
            f('[[تصویر:عکس 2 من.jpg|چپ|120px|توضیحات]]'),
            '[[تصویر:عکس 2 من.jpg|چپ|120px|توضیحات]]',
            'انگلیسی نگاه داشتن عددهای اسم پرونده'
        );
        assert.equal(
            f('{{Infobox settlement|pop_est_as_of=2008}}'),
            '{{Infobox settlement|pop_est_as_of=۲۰۰۸}}',
            'فارسی\u200cسازی اعداد درون جعبه'
        );
        assert.equal(
            f('\n[[1234 تست]]\n'),
            '\n[[۱۲۳۴ تست]]\n',
            'فارسی\u200cسازی اعداد درون پیوند'
        );
        assert.equal(
            f('نسخهٔ کنونی 2.1.20 است.'),
            'نسخهٔ کنونی ۲٫۱٫۲۰ است.',
            'تبدیل ممیز انگلیسی به ممیز فارسی'
        );
        assert.equal(
            f('Publish by xy, 2012. ISBN 1234567.'),
            'Publish by xy, 2012. ISBN 1234567.',
            'تبدیل نکردن پس از متن انگلیسی'
        );
        assert.equal(
            f('—<b>[[کاربر:Reza1615|<span style="color:#C12267">رضا ۱۶۱۵</span>]][[بحث کاربر:Reza1615|<span style="color:#C12267"> / ب</span>]]</b> ‏۱۳ فوریهٔ ۲۰۱۳، ساعت ۱۰:۳۴ (UTC)'),
            '—<b>[[کاربر:Reza1615|<span style="color:#C12267">رضا ۱۶۱۵</span>]][[بحث کاربر:Reza1615|<span style="color:#C12267"> / ب</span>]]</b> ‏۱۳ فوریهٔ ۲۰۱۳، ساعت ۱۰:۳۴ (UTC)',
            'عدم تغییر امضای کاربرها'
        );
        assert.equal(
            f('<math dir="ltr">F(Q_1)= \\int_{0}</math><math>F(Q_1)= \\int_{0}</math>'),
            '<math dir="ltr">F(Q_1)= \\int_{0}</math><math>F(Q_1)= \\int_{0}</math>',
            'تبدیل نکردن ارقام در عبارت\u200cهای ریاضی'
        );
    });

    test('persianWikiTools.wikiApplyZwnj', function (assert) {
        var f = persianWikiTools.wikiApplyZwnj;
        assert.equal(
            f('مضافٌ‌اليه'),
            'مضافٌ‌اليه',
            'فاصله در «در داده‌ها» را تبدیل به نیم‌فاصله نکند'
        );
        assert.equal(
            f('کاوش‌های ماشینی در داده‌ها'),
            'کاوش‌های ماشینی در داده‌ها',
            'فاصله در «در داده‌ها» را تبدیل به نیم‌فاصله نکند'
        );
        assert.equal(
            f('این خانه است وقتی من رفته ام بیرون. تو که ای که چنین می گویی'),
            'این خانه است وقتی من رفته‌ام بیرون. تو که ای که چنین می‌گویی',
            'اتصال ام، ای و... به بن ماضی+ه'
        );
        /*
        assert.equal(
            f('پدید آوردن، پدید آمدن، پدید می‌آورد و پدید آورد'),
            'پدیدآوردن، پدیدآمدن، پدید می‌آورد و پدید آورد',
            'تنها صورتِ مصدری را بی‌فاصله کند'
        );
        */
        assert.equal(
            f('می‌گفت که ای مکه ای بزرگوار'),
            'می‌گفت که ای مکه ای بزرگوار',
            'که ای نیازمند فاصلهٔ مجازی نیست'
        );
        assert.equal(
            f('او باز می گشت به خانه\nما باز نگشتیم به خانه\nمن باز نمی گردم به خانه\nباز نگرفتن'),
            'او بازمی‌گشت به خانه\nما بازنگشتیم به خانه\nمن بازنمی‌گردم به خانه\nبازنگرفتن',
            'اصلاح فاصلهٔ مجازی افعال مرکب پیشونددار'
        );
        assert.equal(
            f('من میدانم او نمی داند که تو در میدانی از شهر ایستادی'),
            'من می‌دانم او نمی‌داند که تو در میدانی از شهر ایستادی',
            'عدم تغییر میدانی'
        );
        assert.equal(
            f('من در پرجمعیت ترین شهر زندگی می کنم'),
            'من در پرجمعیت‌ترین شهر زندگی می‌کنم',
            'اتصال «ترین» با فاصلهٔ مجازی به حرف پیشین'
        );
        assert.equal(
            f('[[پرونده:از مجموعه طرح های شبانه.JPG|بندانگشتی|از مجموعه طرح‌های شبانه]]'),
            '[[پرونده:از مجموعه طرح های شبانه.JPG|بندانگشتی|از مجموعه طرح‌های شبانه]]',
            'نام پرونده‌ها را تغییر ندهد.'
        );
            assert.equal(
            f('وی نمی خواسته دل تو را بشکند'),
            'وی نمی‌خواسته دل تو را بشکند',
            'می+ریشه گذشته+ه را هم فاصلهٔ مجازی بدهد.'
        );
        assert.equal(
            f('جهت‌گذاری‌های عبارت ‎(۱+۲)×۵=۱۵‬ را نباید حذف کرد'),
            'جهت‌گذاری‌های عبارت ‎(۱+۲)×۵=۱۵‬ را نباید حذف کرد',
            'حذف LRE و PDF همیشه هم درست نیست'
        );
        assert.equal(
            f('جهت‌گذاری‌های عبارت ‭(۱+۲)×۵=۱۵‬ را نباید حذف کرد'),
            'جهت‌گذاری‌های عبارت ‭(۱+۲)×۵=۱۵‬ را نباید حذف کرد',
            'حذف LRO و PDF همیشه هم درست نیست'
        );
        assert.equal(
            f('در صفحهٔ x‏، y ذکر شده‌است'),
            'در صفحهٔ x‏، y ذکر شده‌است',
            'حذف RLM همیشه هم درست نیست'
        );
        assert.equal(
            f('شبکه ای\u200cب'),
            'شبکه ای\u200cب',
            'تبدیل نکردن اضافه ه+ای\u200c به فاصلهٔ مجازی'
        );
        assert.equal(
            f('با تمامی توان سعی می‌کردند'),
            'با تمامی توان سعی می‌کردند',
            'اصلاحات سجاوندی: عدم تغییر تمامی توان'
        );
        assert.equal(
            f('می شدم - می روند - می گوید - خانه های من'),
            'می\u200cشدم - می\u200cروند - می\u200cگوید - خانه\u200cهای من',
            'اصلاحات سجاوندی: فاصلهٔ مجازی'
        );
        assert.equal(
            f('د\u200cر بین د و ر نباید فاصله مجازی بدارد'),
            'در بین د و ر نباید فاصله مجازی بدارد',
            'اصلاحات سجاوندی: حذف فاصلهٔ مجازی غیر ضروری'
        );
        assert.equal(
            f('[[ذوزنقه]]\u200cای'),
            '[[ذوزنقه]]\u200cای',
            'حذف نکردن نیم\u200cفاصله پس از براکت'
        );
        assert.equal(
            f('سلطنت می‌کرده‏اند و این‏ پادشاهی'),
            'سلطنت می‌کرده‌اند و این پادشاهی',
            'حذف کاراکترهای LRM، RLM'
        );
        assert.equal(
            f("'''مکانیک شاره ها''': و دانشگاهها\n''مکانیک شاره ها''\n==کتاب ها=="),
            "'''مکانیک شاره‌ها''': و دانشگاه‌ها\n''مکانیک شاره‌ها''\n==کتاب‌ها==",
            "اصلاح «ها» درون دو یا سه ' و درون عنوان بخش"
        );
    });

    test('persianWikiTools.wikiDictation', function (assert) {
        var f = persianWikiTools.wikiDictation;
        assert.equal(
            f("[[مایک ویل مید ایت]]"),
            "[[مایک ویل مید ایت]]",
            'ایت را به آیت تبدیل نکند'
        );
        assert.equal(
            f("ایت‌الله"),
            "آیت‌الله",
            'اصلاح املایی آیت‌الله'
        );
        assert.equal(
            f("[[رده:مردمان مراتی]]"),
            "[[رده:مردمان مراتی]]",
            'رده با بیش از ۵۰ مقاله'
        );
        assert.equal(
            f("سال ۱ ه‌ق سال ۱ ه.ق. سال ۱ ه‍.ق. سال ۱ ه‌خ سال ۱ ه.خ. سال ه.ش. سال ه.ش سال ه‍.خ متن۲"),
            "سال ۱ ه‍.ق سال ۱ ه‍.ق سال ۱ ه‍.ق سال ۱ ه‍.خ سال ۱ ه‍.خ سال ه‍.ش سال ه‍.ش سال ه‍.خ متن۲",
            'اصلاح هجری‌ها بر پایهٔ وپ:کوته‌نوشت بخش مربوط به دیکشنری‌ها'
        );
        assert.equal(
            f('منشا منشاء و مبدا مبداء'),
            'منشأ منشأ و مبدأ مبدأ',
            'همزهٔ پایانی منشأ و مبدأ با پایهٔ الف است.'
        );
        assert.equal(
            f('رحمت الهی و نعمت الهی'),
            'رحمت الهی و نعمت الهی',
            'باید همه‌جا «الهی» با قبلِ خودش فاصله داشته باشد. تنها نام‌هایی مانند «رحمت‌اللهی» و «نعمت‌اللهی» (نه «رحمت الهی» و «نعمت الهی»)، یعنی با دو «ل» نیم‌فاصله دارند.'
        );
        assert.equal(
            f('سوء‌تغذیه'),
            'سوءتغذیه',
            'نیم‌فاصلهٔ پس از همزهٔ پایانی را حذف کند.'
        );
        assert.equal(
            f('اجر و ثواب'),
            'اجر و ثواب',
            'اجر به آجر تبدیل نشود.'
        );
        assert.equal(
            f('ارتقا'),
            'ارتقا',
            'بر روی افزودن یا حذف همزهٔ پایانی اجماعی وجود ندارد.'
        );
        assert.equal(
            f('مهدی پور رحمان'),
            'مهدی پور رحمان',
            '«مهدی پور رحمان» را نباید به «مهدی‌پور رحمان» تبدیل کند.'
        );
        assert.equal(
            f('| birth_name    = روح الله قهرمانی چابک\n| image         =روح الله قهرمانی چابک.jpg\n| caption       ='),
            '| birth_name    = روح‌الله قهرمانی چابک\n| image         =روح الله قهرمانی چابک.jpg\n| caption       =',
            'عدم تغییر نام‌های تصاویر'
        );
        assert.equal(
            f('متن باتجربه تر از موءلف با هیأت رییسه سوءاستفاده و سواستفاده متن'),
            'متن باتجربه‌تر از مؤلف با هیئت رئیسه سوءاستفاده و سوءاستفاده متن',
            'اصلاح همزه و تر در چند کلمه'
        );
        assert.equal(
            f('متن اخیراً متن اخیراٌ<ref> متن اخیرا<ref> متن اخیرا متن'),
            'متن اخیراً متن اخیراً<ref> متن اخیراً<ref> متن اخیراً متن',
            'تبدیل تنوین ضمه به تنوین نصب در مواردی که به اشتباه نوشته شده‌است'
        );
        assert.equal(
            f('من سواستفاده و سو استفاده و «سو استفاده» و سوءاستفاده بلد نیستم.'),
            'من سوءاستفاده و سوءاستفاده و «سوءاستفاده» و سوءاستفاده بلد نیستم.',
            'افزودن ء به وسط کلمه.'
        );
        assert.equal(
            f("متن ''مطلقا'' متن"),
"متن ''مطلقاً'' متن",
            'تبدیل تنوین درون دو آپستروف'
        );
assert.equal(
            f('او اخمو تر و زشت تر و مفید تر از زیباتر بود.'),
            'او اخموتر و زشت‌تر و مفیدتر از زیباتر بود.',
            'اتصال «تر» به صفت با/بدون فاصلهٔ مجازی'
        );
        assert.equal(
            f('تو می ازمایید و می اغشت و می‌امدید و نمی‌اشوبید و نمی اشوبید و می اشوبید.'),
            'تو می آزمایید و می آغشت و می‌آمدید و نمی‌آشوبید و نمی آشوبید و می آشوبید.',
            'اصلاح آ در بن ماضی و مضارع'
        );
        assert.equal(
            f('ارش با لباس اهکی، ابجو ازمایشات مرد امریکایی را در اسمان سنجی یا اسمان‌سنجی انجام دادم.'),
            'آرش با لباس آهکی، آبجو آزمایشات مرد آمریکایی را در آسمان سنجی یا آسمان‌سنجی انجام دادم.',
            'تبدیل «ا» به «آ» در جمله'
        );
        assert.equal(
            f('پس افت اندازه‌گیری اشغال رسمی'),
            'پس افت اندازه‌گیری اشغال رسمی',
            'افت به معنی کاهش نباید به «آ» تبدیل شود، همچنین اشغال'
        );
        assert.equal(
            f('ارش با اسمان‌سنجی و اسمانسنجی انجام دادم.'),
            'آرش با آسمان‌سنجی و آسمانسنجی انجام دادم.',
            'تبدیل «ا» به «آ» در جمله برای حالتی که در کتابخانه کلمه فاصلهٔ مجازی دارد.'
        );
        assert.equal(
            f('وحله و دگمه را درست کن.'),
            'وهله و دکمه را درست کن.',
            'اصلاح غلط املائی.'
        );
        assert.equal(
            f('مولف، [[موخر]] برای تست'),
            'مؤلف، [[مؤخر]] برای تست',
            'تبدیل و به ؤ'
        );
        assert.equal(
            f('ساز و کار'),
            'سازوکار',
            '«ساز و کار» را به سازکار تبدیل نکند.'
        );
        assert.equal(
            f('ایالت میسیسیپی'),
            'ایالت میسیسیپی',
            'میسیسیپی نام ایالت است. نیم‌فاصله‌گذاری نکند.'
        );
        assert.equal(
            f('بهمن ۱۳۹۱'),
            'بهمن ۱۳۹۱',
            'ابزار املا: عدم تغییر اشتباه متن'
        );
        assert.equal(
            f('[[file:علی آباد.jpg|100px|thumb]]'),
            '[[file:علی آباد.jpg|100px|thumb]]',
            'ابزار املا: عدم تغییر نام پرونده\u200cها'
        );
        assert.equal(
            f('علی زاده علی آباد ابرو کمان صد گانه'),
            'علی\u200cزاده علی\u200cآباد ابروکمان صدگانه',
            'ابزار املا: فعال بودن'
        );
        assert.equal(
            f('[[file:علی آباد 123 .jpg]]'),
            '[[file:علی آباد 123 .jpg]]',
            'عدم تغییر نام پرونده بدون توضیح'
        );
        assert.equal(
            f('تست ظاهرا. اتفاقا کاملاً اتفاقات را به "تماما" با <ref nam="سوما"> تست'),
            'تست ظاهراً. اتفاقاً کاملاً اتفاقات را به "تماما" با <ref nam="سوما"> تست',
            'اصلاح تنوین'
        );
        assert.equal(
            f('<ref name="اتفاقا">'),
            '<ref name="اتفاقا">',
            'خرابکاری نکردن در نام ارجاع'
        );
    });
    test('persianWikiTools.wikiSubsection', function (assert) {
        var f = persianWikiTools.wikiSubsection;
        assert.equal(
            f('متن\n= see also =\n== ارجاع‌ها ==\n<references/>\n= پانویس =\n{{چپ چین}}\n{{پانویس}}\n{{پایان}}\n= پانویس۲ =\n{{راست چین}}\n{{پانویس}}\n{{پایان}}'),
            'متن\n= جستارهای وابسته =\n== منابع ==\n{{پانویس}}\n= پانویس =\n{{پانویس|چپ‌چین=بله}}\n= پانویس۲ =\n{{پانویس}}',
            'اصلاح عنوان زیربخش'
        );
    });
    // از این قسمت فقط برای تست عمومی ابزارها مثلاً اینکه آیا استفاده‌یشان با هم مشکلی ندارد استفاده شود و کاربرد دیگر آن
    // برای ابزارهای اتواد ویکی‌انگلیسی است اگر تست جدا نداشته باشند
    test('persianWikiTools.superTools', function (assert) {
        var f = persianWikiTools.superTool;
        assert.equal(
            f("سال ۱ ه‌ق سال ۱ ه.ق. سال ۱ ه‍.ق. سال ۱ ه‌خ سال ۱ ه.خ. سال ه.ش. سال ه.ش سال ه‍.خ متن"),
            "سال ۱ ه‍.ق سال ۱ ه‍.ق سال ۱ ه‍.ق سال ۱ ه‍.خ سال ۱ ه‍.خ سال ه‍.ش سال ه‍.ش سال ه‍.خ متن",
            'اصلاح هجری‌ها بر پایهٔ وپ:کوته‌نوشت'
        );
        assert.equal(
            f("متن <math>a_{1}geq a_{2} geq a_3 geq ... geq a_k</math> متن\n\n<center><math>H_0: eta_1 = eta_2 = ldots = eta_q = 0 </math></center> متن"),
            "متن <math>a_{1}geq a_{2} geq a_3 geq ... geq a_k</math> متن\n\n{{وسط‌چین}}<math>H_0: eta_1 = eta_2 = ldots = eta_q = 0 </math>{{پایان}} متن",
            'عدم تغییر درون برچسب math'
        );
        assert.equal(
            f("l\n<ol>\n  <li>Coffee</li>\n  <li>Tea</li>\n  <li>Milk</li>\n</ol>\n<ul>\n  <li>Coffee</li>\n  <li>Tea</li>\n  <li>Milk</li>\n</ul>"),
            "l\n# Coffee\n# Tea\n# Milk\n* Coffee\n* Tea\n* Milk",
            'تبدیل برچسب اچ‌تی‌ام‌ال به سینتکس مدیاویکی'
        );
        assert.equal(
            f("a، dcb؛ cf «bd» be۱fde"),
            'a, dcb; cf "bd" be1fde',
            'تبدیل سجاندی فارسی درون متن انگلیسی'
        );
        assert.equal(
            f('text &iexcl; text2\ntext&ndash;text3\n&lceil;text4'),
            'text ¡ text2\ntext–text3\n⌈text4',
            'تبدیل نشانه‌های اچ‌تی‌ام‌ال به یونیکد'
        );
        assert.equal(
            f('متن متن <math>y_i = a + bx_1 + bx_2 + ... + bx_n + e_i\ </math> متن متن متن'),
            'متن متن <math>y_i = a + bx_1 + bx_2 + ... + bx_n + e_i\ </math> متن متن متن',
            'سه نقطه داخل الگو ریاضی تبدیل نشود'
        );
        assert.equal(
            f('ا\n۱۵٪<ref name="BOIVIN_۲۰۰۱" />\na\n۱۵٪<ref name="BOIVIN_۲۰۰۱" />\nا\n۱۵٪<ref name="BOIVIN_۲۰۰۱" />\n{{پانویس}}'),
            'ا\n۱۵٪<ref name="BOIVIN_2001"/>\na\n۱۵٪<ref name="BOIVIN_2001"/>\nا\n۱۵٪<ref name="BOIVIN_2001"/>\n{{پانویس}}',
            'تبدیل عدد فارسی درون رفرنس به عدد انگلیسی در صورتی که برچسب انگلیسی باشد'
        );
        assert.equal(
            f('متن [http://www.ncbi.nlm.nih.gov/pubmedhealth/PMH0002518/ اینجا] متن'),
            'متن [http://www.ncbi.nlm.nih.gov/pubmedhealth/PMH0002518/ اینجا] متن',
            'عدم تغییر در نشانی اینترنتی'
        );
        assert.equal(
            f('شسیشسی "اتفاقا" شسیشسی'),
            'شسیشسی «اتفاقا» شسیشسی',
            'ابتدا تبدیل به گیونه'
        );
        assert.equal(
            f('|term_start2=October 2007\n|term_end2=March 13, 2008\n|متن'),
            '|term_start2=اکتبر ۲۰۰۷\n|term_end2=۱۳ مارس ۲۰۰۸\n|متن',
            'عدم تغییر در عدد متغییرهای جعبه'
        );
        assert.equal(
            f('<!--ابر-->[[ابراهیم آبادی]]<!--/ابر--><nowiki>ابراهیم آبادی</nowiki>'),
            '<!--ابر-->[[ابراهیم آبادی]]<!--/ابر--><nowiki>ابراهیم آبادی</nowiki>',
            'عدم تغییر متن درون تگ‌های abar و nowiki'
        );
        assert.equal(
            f('{{استثنای ابرابزار|[[اوریم]]}}'),
            '{{استثنای ابرابزار|[[اوریم]]}}',
            'محتوای الگو:استثنای ابرابز را ویرایش نکن'
        );
        assert.equal(
            f('متن [[ISBN 0-553-58581-9]] متن\nمتن ISBN:0-553-5 8581-9 متن'),
            'متن ISBN 0-553-58581-9 متن\nمتن ISBN 0-553-58581-9 متن',
            'اصلاح شابک توسط ویکی‌اد'
        );
        /* assert.equal(
            f('[https://books.google.de/books?id=eUxRAAAAcAAJ&pg=PA186&lpg=PA186&dq="baron+von+Semlin"&source=bl&ots=5_g2dWpEcQ&sig=_B5h-k7kQKex_kM2Ktd1iEIR31g&hl=de&sa=X&ei=6lVXVdHaH4uPsAGts4CICg&ved=0CEEQ6AEwBQ#v=onepage&q="baron%20von%20Semlin"&f=false/ «فرانتس گرفر» در مجله سرگرمی‌های علمی. وین در سال ۱۸۲۱. جلد اول صفحه ۱۸۶]'),
            '[https://books.google.de/books?id=eUxRAAAAcAAJ&pg=PA186&lpg=PA186&dq=%22baron+von+Semlin%22&source=bl&ots=5_g2dWpEcQ&sig=_B5h-k7kQKex_kM2Ktd1iEIR31g&hl=de&sa=X&ei=6lVXVdHaH4uPsAGts4CICg&ved=0CEEQ6AEwBQ#v=onepage&q=%22baron%20von%20Semlin%22&f=false/ «فرانتس گرفر» در مجله سرگرمی‌های علمی. وین در سال ۱۸۲۱. جلد اول صفحه ۱۸۶]',
            'اصلاح نشانی اینترنتی نادرست'
        ); */
        assert.equal(
            f('من جدیدا" هم این لطفا" به'),
            'من جدیداً هم این لطفاً به',
            'ابتدا تبدیل به تنوین بعد تبدیل به گیومه'
        );
        assert.equal(
            f('<source><h1>heading</h1></source>'),
            '<source><h1>heading</h1></source>',
            'تگ‌های heading داخل source را به == == تبدیل نکند.'
        );
        assert.equal(
            f('<nowiki><HR></nowiki>'),
            '<nowiki><HR></nowiki>',
            'تگ HR داخل nowiki را به ---- تبدیل نکند.'
        );
        assert.equal(
            f('[[1234 تست]]'),
            '[[۱۲۳۴ تست]]',
            'آزمایش اینکه به کل از کار نیافتاده'
        );
        assert.equal(
            f("<ref>[http://www.acfe.com/uploadedFiles/ACFE_Website/Content/rttn/2012-report-to-nations.pdf دانلود نسخه کامل (۷۶ صفحه، ۸ مگا بایت) '''گزارش به ملت‌ها دربارهٔ تقلب‌ها و سوءاستفاده‌های شغلی'''، [[انجمن بازرسان تقلب گواهی شده]]، ۲۰۱۲]</ref>\n{{پانویس}}"),
            "<ref>[http://www.acfe.com/uploadedFiles/ACFE_Website/Content/rttn/2012-report-to-nations.pdf دانلود نسخه کامل (۷۶ صفحه، ۸ مگا بایت) '''گزارش به ملت‌ها دربارهٔ تقلب‌ها و سوءاستفاده‌های شغلی'''، [[انجمن بازرسان تقلب گواهی شده]]، ۲۰۱۲]</ref>\n{{پانویس}}",
            "براکت را به اشتباه پاک نکند"
        );
        assert.equal(
            f('[[Link|' + ']]'),
            '[[Link|' + ']]',
            'بعد از خط فاصله ندهد'
        );
    });

    test('persianWikiTools.cleanTemplateBracesFromArticle', function (assert) {
        var f = persianWikiTools.cleanTemplateBracesFromArticle;
        assert.equal(
            f('{{#if:', true/*alwaysRun*/),
            '{{جا:#if:',
            'شرط جا: شود'
        );
        assert.equal(
            f('{{#invoke:', true/*alwaysRun*/),
            '{{#invoke:',
            'فراخوانی پودمان جا نشود.'
        );
    });
    
    test('persianWikiTools.superToolMove', function (assert) {
        var f = persianWikiTools.superToolMove;
        assert.equal(
            f('1234 تست'),
            '۱۲۳۴ تست',
            'آزمایش اینکه به کل از کار نیافتاده'
        );
    });

    test('persianWikiTools.addColumnToRefTemplate', function (assert) {
        var f = persianWikiTools.addColumnToRefTemplate;
        assert.equal(
            f('<ref>t</ref><ref>t</ref>{{پانویس}}'),
            '<ref>t</ref><ref>t</ref>{{پانویس}}',
            'باید ۶ پانویس پیدا کند تا ستون را به الگوی پانویس بیافزاید.'
        );
        assert.equal(
            f('<ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref>{{پانویس}}'),
            '<ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref>{{پانویس|۲}}',
            '۶ پانویس یافت شد؛ بنابراین باید به الگوی پانویس ستون ۲ را اضافه کند.'
        );
        assert.equal(
            f('<ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref>{{پانویس|۲}}'),
            '<ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref>{{پانویس|۲}}',
            'ستون از پیش برای الگوی پانویس تعریف شده\u200cاست، بنابراین تغییری نباید ایجاد کند.'
        );
        assert.equal(
            f('{{پانویس}}'),
            '{{پانویس}}',
            'هیچ پانویسی یافت نشد؛ بنابراین، نباید ستون را بیافزاید.'
        );
        assert.equal(
            f('<ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref>{{پانویس|عرض=۳۰}}'),
            '<ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref><ref>t</ref>{{پانویس|عرض=۳۰}}',
            'پارامتر عرض تعریف شده‌است؛ بنابراین، نباید ستون به الگو بیافزاید.'
        );
    });
    
    test('persianWikiTools.fixBadLinks', function (assert) {
        var f = persianWikiTools.fixBadLinks;
        assert.equal(
            f('[[سلام|سلام]]'),
            '[[سلام]]',
            'متن جایگزین پیوند با خودش یکسان است؛ بنابراین، باید متن جایگزین را حذف کند.'
        );
        assert.equal(
            f('تست [[سلام|سلام]] تست'),
            'تست [[سلام]] تست',
            'متن جایگزین پیوند با خودش یکسان است؛ بنابراین، باید متن جایگزین را حذف کند.'
        );
        assert.equal(
            f('متن [[۳۶۵ (میلادی)|۳۶۵]] متن\n متن [[۳۶۵ (میلادی)]] متن'),
            'متن ۳۶۵ متن\n متن ۳۶۵ متن',
            'حذف پیوند تاریخ.'
        );
        assert.equal(
            f('[[سلام]]'),
            '[[سلام]]',
            'پیوند متن جایگزین ندارد بنابراین تغییری ایجاد نمی‌کند.'
        );
        assert.equal(
            f('[[پرونده:example.gif|توضیح تصویر]]'),
            '[[پرونده:example.gif|توضیح تصویر]]',
            'فقط پیوندها را باید تشخیص دهد.'
        );
        assert.equal(
            f('[[:en:Hello World!|Hello World!]]'),
            '[[:en:Hello World!|Hello World!]]',
            'متن جایگزین پیوندهای میان‌ویکی را نباید حذف کند.'
        );
        assert.equal(
            f('[[۲۰۱۵]]'),
            '۲۰۱۵',
            'سال را باید از پیوند خارج کند.'
        );
        assert.equal(
            f('[[۲۰۱۵|سال ۲۰۱۵]]'),
            'سال ۲۰۱۵',
            'متن جایگزین به پیوند سال ارجحیت دارد.'
        );
        assert.equal(
            f('[[سلام دنیا|چه دنیایی است!]]'),
            '[[سلام دنیا|چه دنیایی است!]]',
            'نه متن جایگزین برابر نشانی پیوند است نه مربوط به سال و ماه است؛ بنابراین، نباید چیزی حذف شود.'
        );
        assert.equal(
            f('[[۲ شهریور]]'),
            '۲ شهریور',
            'پیوند به «روز و ماه» جایز نیست.'
        );
    });
    test('persianWikiTools.sortCategories', function (assert) {
        var f = persianWikiTools.sortCategories;
        assert.equal(
            f('شسی\n\n[[رده:ش]]\n[[رده:ب]]\n[[رده:پ]]\n[[رده:س]]\n[[رده:ث]]\n\nasf', 'ب'),
            'شسی\n\n[[رده:ب| ]]\n[[رده:پ]]\n[[رده:ث]]\n[[رده:س]]\n[[رده:ش]]\n\nasf',
            'مرتب‌سازی رده‌ها به الفبای فارسی و قرار دادن صفحهٔ هم‌نام در بالا صفحه و رده'
        );
        assert.equal(
            f('\n[[رده:a]]\n[[رده:2]]\n[[رده:۱]]\n', 'ب'),
            '\n[[رده:۱]]\n[[رده:2]]\n[[رده:a]]\n',
            'ارقام فارسی به مانند غیر فارسی در بالا قرار گیرد'
        );
        assert.equal(
            f('\n[[رده:ن]]\n[[رده:ا]]\n[[رده:و]]\n[[رده:ه]]\n', 'ب'),
            '\n[[رده:ا]]\n[[رده:ن]]\n[[رده:و]]\n[[رده:ه]]\n',
            '«و» پس از «ن» و پیش «ه» قرار گیرد'
        );
    });
    QUnit.start(); //now start running QUnit (T214854)
}, function (assert) {
    'use strict';
    QUnit.throws('Fatal error, something is moved or so');
});
// </pre>