internationalization.lib.test.php 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * This is a test of internationalization.lib.php which is
  5. * a common purpose library for supporting internationalization
  6. * related functions. Only the public API is tested here.
  7. * @author Ricardo Rodriguez Salazar, 2009.
  8. * @author Ivan Tcholakov, 2009-2010.
  9. *
  10. * Notes:
  11. * 1. While saving this file, please, preserve its UTF-8 encoding.
  12. * Othewise this test would be broken.
  13. * 2. While running this test, send a header declaring UTF-8 encoding.
  14. * Then you would see variable dumps correctly.
  15. * 3. Tests about string comparison and sorting might give false results
  16. * if the intl extension has not been installed.
  17. */
  18. class TestInternationalization extends UnitTestCase {
  19. private $language_strings = array( // All these strings are UTF-8 encoded.
  20. 'afrikaans' => "Hy laat my in groen weivelde rus. Hy bring my by waters waar daar vrede is.",
  21. 'albanian' => "Çdokush prej jush mund të kontribuojë vullnetarisht me dijen e tij për zgjerimin e mëtejshëm të kësaj enciklopedie të lirë.",
  22. 'alemannic' => "Das bedütet, dass a dem Projekt alli chöi teilnä, wo en alemannischi Dialektspilart beherrsche, wo da gredt wird.",
  23. 'amharic' => "ዳግማዊ ፡ ምኒልክ ፡ ንጉሠ ፡ ነገሥት ፡ ዘኢትዮጵያ ።",
  24. 'arabic' => "ما اسمك؟",
  25. 'armenian' => "Ընդհանուր տեղեկություններ, կառավարման համակարգ, ժողովրդագրություն և աշխարհագրական տվյալներ:",
  26. 'asturian' => "La ortografía nun ye fonolóxica sinon histórica, tando considerada como una de les llingües más abegoses d'aprender de les qu'usen esi alfabetu.",
  27. 'belarusian' => "Умоўным часам пачатку гісторыі сучаснай беларускай літаратурнай мовы лічыцца пачатак 19 стагоддзя.",
  28. 'bosnian' => "Engleski jezik je nastao iz jezika germanskih plemena koja su se u kasnom starom vijeku naselila na jugoistoku otoka Velike Britanije.",
  29. 'brazilian' => "O governo federal irá zerar o número de municípios sem bibliotecas este ano. De acordo com o Sistema Nacional de Bibliotecas Públicas, 661 municípios ainda não têm esses equipamentos. Se sua cidade não estiver nesta relação e não possuir biblioteca pública municipal, informe aqui. A cultura é um direito de todo o cidadão!",
  30. 'breton' => "Hon Tad, c'hwi hag a zo en Neñv, ra vo santelaet hoc'h ano. Ra zeuio ho Rouantelezh.",
  31. 'bulgarian' => "Глобалното затопляне ще освободи Северния ледовит океан от ледовете през лятото през следващите 20 години.",
  32. 'catalan' => "Els drets juridicolingüístics dels catalanoparlants són ben diferents segons l'indret geogràfic, podem parlar de catalanoparlants de primera i de segona.",
  33. 'croatian' => "Oče naš, koji jesi na nebesima, sveti se ime Tvoje. Dođi kraljevstvo Tvoje, budi volja Tvoja, kako na Nebu, tako i na Zemlji.",
  34. 'czech' => "V převážné většině mezinárodních škol je vyučovacím jazykem angličtina.",
  35. 'danish' => "Et ganske særligt kendetegn ved dansk er stød.",
  36. 'dari' => "جمعیت افغانستان حدود ۳۰ میلیون نفر برآورد می‌شود. براساس سرشماری مقدماتی کمیته ملی احصائیه کشور، جمعیت افغانستان در سال ۱۳۸۵، ۲۴ میلیون",
  37. 'dutch' => "De officiële taal, zoals die wordt onderwezen op scholen en gebruikt wordt door de autoriteiten, wordt Standaardnederlands genoemd.",
  38. 'english' => "Approximately 375 million people speak English as their first language.",
  39. 'esperanto' => "La vortprovizo de Esperanto devenas plejparte el la okcidenteŭropaj lingvoj, dum ĝia sintakso kaj morfologio montras ankaŭ slavlingvan influon.",
  40. 'estonian' => "Ta eelistab lubjarikast pinnast, kuid kasvab ka settelistel muldadel ja väheviljakal pinnasel, kus teisi puittaimi ei leidu.",
  41. 'basque' => "Euskaren gramatika zailtasun handikoa da, horrez gain, hizkuntza indoeuroparra ez izanik, eratze edo joskera bereziak ditu, beste hizkuntzetan aurkitu ez ditzakegunak.",
  42. 'finnish' => "Nominit taipuvat sijoissa eli sijamuodoissa yleensä sekä yksikössä että monikossa.",
  43. 'french' => "La majorité du fonds lexical français provient du latin (en tant que langue-mère) ou bien est construit à partir des racines gréco-latines.",
  44. 'frisian' => "Us Heit, dy't yn de himelen is jins namme wurde hillige. Jins keninkryk komme.",
  45. 'friulian' => "Mandi, jo mi clami Jacum! Vuê al è propite cjalt! O scugni propite lâ cumò, ariviodisi.",
  46. 'galician' => "Se borrarán todos los comentarios que, con criterio subjetivo como en toda web, se consideren inadecuados.",
  47. 'georgian' => "საკუთარ პერიოდში ბუგერო მსოფლიოს ერთ-ერთ უდიდეს მხატვრად იყო აღიარებული, თუმცა მე-20 საუკუნის დასაწყისში მას უკვე არაფრად აგდებდნენ, შესაძლოა მისი იმპრესიონისტთა მიმართ აგრესიულობის გამო. მიუხედავად ამისა, დღეს მას თაყვანისმცემლების ახალი დიდი ტალღა შეემატა - მისი ნამუშევრები მსოფლიოს ასზე მეტ უდიდეს მუზეუმშია გამოფენილი.",
  48. 'german' => "Durch ihre zentrale Lage in Europa wurde die deutsche Sprache über die Jahrhunderte durch andere Sprachen beeinflusst.",
  49. 'greek' => "Η ναυτική βιομηχανία αποτέλεσε ένα σημαντικό στοιχείο της Ελληνικής οικονομικής δραστηριότητας από τα αρχαία χρόνια.",
  50. 'hawaiian' => "A ma mua o ka hō'ea 'ana i Tahiti, ua ho'okele maila lākou mai Sāmoa a Tonga paha.",
  51. 'hebrew' => "שימו לב: אם עדיין לא נרשמתם, ייתכן כי חלק מהתכונות אינן זמינות לכם. במקרה זה רצוי ליצור חשבון חדש, פעולה האורכת מספר דקות בלבד. ראו איך ליצור חשבון חדש.",
  52. 'hindi' => "साइट का लिंक लगाने के लिए निम्नांकित फार्मेट में उपयुक्त कक्ष में/या नया कक्ष बना कर लिखें :",
  53. 'hungarian' => "A magyar nyelv az uráli nyelvcsalád tagja, a finnugor nyelvek közé tartozó ugor nyelvek egyike.",
  54. 'icelandic' => "Margir Íslendingar telja íslenskuna vera „upprunalegra“ mál en flest önnur og að hún hafi breyst minna.",
  55. 'indonesian' => "Selain itu, Baristand senantiasa meningkatkan kualitas personil dan berbagai fasilitas pendukung industri, serta fasilitas lainnya yaitu perpustakaan dengan buku-buku ilmiah, laporan hasil penelitian, dan majalah ilmiah.",
  56. 'irish' => "háinig críoch dheifnideach lena chuid scríbhneoireachta nuair a cuireadh i dteach na ngealt é agus síocóis dhúlagrach ag luí ar a intinn.",
  57. 'italian' => "Tuttavia l'assetto attuale della lingua è in sostanza quello del fiorentino trecentesco, ripulito dei tratti più marcatamente locali.",
  58. 'japanese' => "日本語(にほんご、にっぽんご)は、主として、日本で使用されてきた言語である。日本国は法令上、公用語を明記していないが、事実上の公用語となっており、学校教育の「国語」で教えられる。",
  59. 'korean' => "이 문서는 삭제되었습니다. 이 문서의 삭제/이동 기록은 다음과 같습니다.",
  60. 'latin' => "Architecti est scientia pluribus disciplinis et variis eruditionibus ornata, cuius iudicio probantur omnia quae ab ceteris artibus perficiuntur opera.",
  61. 'latvian' => "Tas visvairāk ir vērojams jaunu terminu darināšanā, kas bieži izsauc arī negatīvu reakciju.",
  62. 'lithuanian' => "Dabartinės literatūrinės kalbos pagrindas remiasi vakarų aukštaičių pietiečių (suvalkiečių) tarme, išlaikiusia senesnes fonetikos ir morfologijos lytis.",
  63. 'macedonian' => "Залагањето за создавање на македонски литературен јазик датира уште од почетокот на XIX век, со појавата на Просветителите.",
  64. 'malay' => "Suntingan yang tidak sesuai akan dikeluarkan segera, dan pesalah yang berulang boleh disekat daripada menyunting. Harap maklum.",
  65. 'manx' => "Haink ram cooney da aavioghey ny Gaelgey liorish yn obbyr recortyssagh jeant liorish aahirreyderyn 'sy 20oo eash.",
  66. 'marathi' => "समस्त विकिपीडिया वाचक आणि संपादकांना दीपावलीच्या हार्दीक शुभेच्छा !",
  67. 'middle_frisian' => "30 beest van en wief dat er gen schrift van is dy plæge hem Kom krod my ney de Verman ta.",
  68. 'mingo' => "Kakwékö nêkê ne'hu niyawë'ö, ne n-u'kaiwayeí ne' thusnye'ö N-awëníyu', ne' húkwa huwënitkëhtahkö haya'tatek, n- utukëstaniak, háwê,",
  69. 'nepali' => "तपाईंको/तिम्रो नाम के हो?",
  70. 'norwegian' => "Språksamfunn lånar ord frå meir prestisjefylte språksamfunn, via tospråklege talarar. Studium av lånordslag i norsk speglar dermed samfunnsmessige tilhøve i Europa opp gjennom hundreåra.",
  71. 'occitan' => "Ara s'estima que sus una populacion de 14 o 15 milions d'occitans, son entre 500 000 e 2 000 000 los que son capables de parlar l'occitan correntament, mas las ocasions de lo parlar dins la societat son raras.",
  72. 'pashto' => "د راجيت سيتارام پنډت په قول ميلنده پڼهو اصلي نسخه په زړه پښتو ليکل شويده - موړ کتاب چې د",
  73. 'persian' => "زبان فارسی (پارسی، دری، یا تاجیکی) زبانی است که در کشورهای ایران، افغانستان[۲]، تاجیکستان[۳] و",
  74. 'polish' => "Język polski wywodzi się z języka praindoeuropejskiego za pośrednictwem języka prasłowiańskiego.",
  75. 'portuguese' => "Assim como os outros idiomas, o português sofreu uma evolução histórica, sendo influenciado por vários idiomas e dialetos, até chegar ao estágio conhecido atualmente. Deve-se considerar, porém, que o português de hoje compreende vários dialetos e subdialetos, falares e subfalares, muitas vezes bastante distintos, além de dois padrões reconhecidos internacionalmente (português brasileiro e português europeu).",
  76. 'quechua_cusco' => "Simi yachaqkunaqa rimanakun, qhichwa simi hukllachu achkachu rimay. SIL International nisqa tantanakuy ninmi, 42 rimaymi, nispa.",
  77. 'romanian' => "Limba română este vorbită în toată lumea de aproximativ 26 de milioane de persoane.",
  78. 'rumantsch' => "Mintga idiom ha sviluppà sia atgna lingua da scrittira ch'è dentant savens era puspè in cumpromiss tranter ils differents dialects regiunals e locals.",
  79. 'russian' => "Русский язык — один из восточнославянских языков, один из крупнейших языков мира, в том числе самый распространённый из славянских языков и самый распространённый язык Европы, как географически, так и по числу носителей языка как родного (хотя также значительная и географически большая часть русского языкового ареала находится в Азии).",
  80. 'sanskrit' => "एयं भाषा न केवलं भारतस्‍य अपितु विश्‍वस्‍यप्राचीनतमा भाषा मन्‍यते। इयं भाषा एतावती समृद्घा अस्‍ति यत्‌ प्राय: सर्वासु भारतीयभाषासु न्‍यूनाधिकरूपेण अस्‍या: शब्‍दा: प्रयुज्‍यन्‍ते. अत: भाषाविदां मते इयं सर्वासां भाषाणां जननी मन्‍यते। पुरा संस्कृतं लोकभाषा आसीत्‌। जना: संस्कृतं वदन्ति स्म॥ विश्‍वस्‍य आदिम: ग्रन्‍थ: ऋग्‍वेद: संस्‍कृतभाषायामेवास्‍ति। अन्‍ये च वेदा: यथा यजुर्वेद:, सामवेद:, अथर्ववेदश्‍च संस्‍कृतभाषायामेव सन्‍ति। आयुर्वेद धनुर्वेद गन्‍धर्ववेदार्थवेदाख्‍या: चत्‍वार: उपवेदा: अपि संस्‍कृते एव विरचिता:॥ सर्वा: उपनिषद: संस्‍कृते उपनिबद्घाः। अन्‍ये ग्रन्‍था: - शिक्षा, कल्‍प, निरुक्त, ज्‍योतिष, छन्‍द, व्‍याकरण, वेदाङ्ग, दर्शन, इतिहास, पुराण, काव्‍य, शास्‍त्र: चेत्यादयः ॥ महर्षि-पाणिनिना विरचिता अष्‍टाध्‍यायी इति संस्‍कृतव्‍याकरणम्‌ अधुनापि भारते विदेशेषु च भाषाविज्ञानिनां प्रेरणास्‍थानं वर्तते ॥ वाक्यकारं वररुचिं भाष्यकारं पतंजलिम् | पाणिनिं सूत्रकारं च प्रणतोस्मि मुनित्रयम् ॥",
  81. 'scots' => "Anglian speakers wis weel staiblisht in sooth-east Scotland by the 7t century. In the 13t century Norman landawners an thair reteeners, speakin Northumbrian Middle Inglis, wis inveetit tae come an sattle by the Keeng.",
  82. 'scots_gaelic' => "Ciamar a tha thu? Dè an t-ainm a tha ort? Dè a tha seo?",
  83. 'serbian' => "Gajica je objavljena je 1830. godine u Zagrebu u „kratkoj osnovi horvatsko-slavonskoga pravopisa“. Razvio ju je Ljudevit Gaj.",
  84. 'serbian_cyrillic' => "Као и када су други језици у питању, неопходно је разграничити појам језичких система којим се Срби како етницитет служе од стандардног језика који се употребљава у државним и културним институцијама.",
  85. 'simpl_chinese' => "现代标准汉语,是普通话、国语、华语的统称,指通行于中国大陆和香港、澳门、台湾、海外华人的共通语文,为现代汉语共通的交际口语与书面语,是联合国官方语言之一,是国际人士学习汉语言的主要参照。",
  86. 'slovak' => "Ak ste nedávno napísali tento článok, skúste vyčistiť jeho vyrovnávaciu pamäť alebo chvíľu počkať predtým, než ho znova vytvoríte.",
  87. 'slovenian' => "Slovénščina je južnoslovanski jezik z okoli 2,2 milijonoma govorcev po svetu, od katerih jih večina živi v Sloveniji. Je eden redkih indoevropskih jezikov, ki je še ohranil dvojino.",
  88. 'spanish' => "El castellano es lengua oficial de España. También se habla en Gibraltar[70] y en Andorra (donde es la lengua materna mayoritaria debido a la inmigración, pero no es la lengua propia y oficial como sí lo es el catalán[71] ).",
  89. 'swahili' => "Lugha hii ina utajiri mkubwa wa misamiati na misemo na mithali na mashairi na mafumbo na vitendawili na nyimbo.",
  90. 'swedish' => "Hej. Hur är det? Bara bra, tack. Förlåt, jag har glömt, varifrån kommer du nu igen?",
  91. 'tagalog' => "Ang Wikibooks ay isang ambagang proyekto sa pagkagawa ng isang koleksyon ng mga libre at malayang-kontentong pang-araling aklat na pwede mong baguhin.",
  92. 'tamil' => "நீங்கள் ஆங்கிலம் பேசுவீர்களா?",
  93. 'thai' => "ภาษาไทย เป็นภาษาราชการของประเทศไทย และภาษาแม่ของชาวไทย และชนเชื้อสายอื่นในประเทศไทย ภาษาไทยเป็นภาษาในกลุ่มภาษาไต ซึ่งเป็นกลุ่มย่อยของตระกูลภาษาไท-กะได สันนิษฐานว่า",
  94. 'trad_chinese' => "中華民國,在亞東之極,本都南京,因事失地泰半,暫遷於臺北。其東以鴨綠江界朝鮮國,隔東海望日本。其北與俄羅斯相接。其西有大山,天下至高者也。而皆失於內戰,今僅得臺灣及其周圍矣。",
  95. 'turkish' => "Bu kitapta Türkçe konuşmak, yazmak ve okumak için gereken her şeyi bulacaksınız.",
  96. 'ukrainian' => "Українська мова є мовою найбільшого корінного етносу України і невід'ємною базовою ознакою його ідентичності протягом багатьох століть.",
  97. 'vietnamese' => "Tiếng Việt là ngôn ngữ chính thức tại Việt Nam, và cũng là ngôn ngữ phổ thông đối với các dân tộc thiểu số tại Việt Nam.",
  98. 'welsh' => "Gan nad oedd y Frythoneg yn iaith ysgrifenedig tystiolaeth anuniongyrchol yn unig sydd i'r newidiadau a ddigwyddodd iddi.",
  99. 'yiddish' => "יידיש אדער אידיש (Yiddish) גערופֿן ביי אידן אלס מאַמע לשון, איז אַ שפּראַך װאָס װערט הײַנט גערעדט ביי 1.5 מיליאָן יידן[1] און באַקאַנט ביי 3,142,560 מיליאָן [2] מענטשן איבער דער װעלט, בעיקר פֿונעם אַשכנזישן אָפּשטאַם.",
  100. 'yoruba' => "Èdè Yorùbá Ní báyìí, tí a bá wo èdè Yorùbá, àwon onímò pín èdè náà sábée èyà wa nínú e bí èdè Niger-Congo. Wón tún fìdí rè múlè pé èyà wa yìí ló wópò jùlo ní síso, ní ìwò oòrùn aláwò dúdú fún egbe-egbèrún odún."
  101. );
  102. function TestInternationalization() {
  103. $this->UnitTestCase('Internationalization library - main/inc/lib/internationalization.lib.test.php');
  104. }
  105. /**
  106. * ----------------------------------------------------------------------------
  107. * A safe way to calculate binary lenght of a string (as number of bytes)
  108. * ----------------------------------------------------------------------------
  109. */
  110. public function test_api_byte_count() {
  111. $string = 'xxxáéíóú?'; // UTF-8
  112. $res = api_byte_count($string);
  113. $this->assertTrue($res == 14);
  114. $this->assertTrue(is_numeric($res));
  115. //var_dump($res);
  116. }
  117. /**
  118. * ----------------------------------------------------------------------------
  119. * Multibyte string conversion functions
  120. * ----------------------------------------------------------------------------
  121. */
  122. public function test_api_convert_encoding() {
  123. $string = 'xxxáéíóú?€'; // UTF-8
  124. $from_encoding = 'UTF-8';
  125. $to_encoding = 'ISO-8859-15';
  126. $res = api_convert_encoding($string, $to_encoding, $from_encoding);
  127. $this->assertTrue(is_string($res));
  128. $this->assertTrue(api_convert_encoding($res, $from_encoding, $to_encoding) == $string);
  129. //var_dump($res);
  130. //var_dump(api_convert_encoding($res, $from_encoding, $to_encoding));
  131. }
  132. public function test_api_utf8_encode() {
  133. $string = 'xxxáéíóú?€'; // UTF-8
  134. $from_encoding = 'ISO-8859-15';
  135. $string1 = api_utf8_decode($string, $from_encoding);
  136. $res = api_utf8_encode($string1, $from_encoding);
  137. $this->assertTrue(is_string($res));
  138. $this->assertTrue($res == $string);
  139. //var_dump($res);
  140. }
  141. public function test_api_utf8_decode() {
  142. $string = 'xxxx1ws?!áéíóú@€'; // UTF-8
  143. $to_encoding = 'ISO-8859-15';
  144. $res = api_utf8_decode($string, $to_encoding);
  145. $this->assertTrue(is_string($res));
  146. $this->assertTrue(api_utf8_encode($res, $to_encoding) == $string);
  147. //var_dump($res);
  148. }
  149. public function test_api_to_system_encoding() {
  150. $string = api_utf8_encode(get_lang('Title'), api_get_system_encoding());
  151. $from_encoding = 'UTF-8';
  152. $check_utf8_validity = false;
  153. $res = api_to_system_encoding($string, $from_encoding, $check_utf8_validity);
  154. $this->assertTrue(is_string($res));
  155. $this->assertTrue(api_convert_encoding($res, $from_encoding, api_get_system_encoding()) == $string);
  156. //var_dump(api_utf8_encode($res, api_get_system_encoding()));
  157. }
  158. public function test_api_htmlentities() {
  159. $string = 'áéíóú@!?/\-_`*ç´`'; // UTF-8
  160. $quote_style = ENT_QUOTES;
  161. $encoding = 'UTF-8';
  162. $res = api_htmlentities($string, $quote_style, $encoding);
  163. $this->assertTrue(is_string($res));
  164. $this->assertTrue(api_convert_encoding($res, $encoding, 'HTML-ENTITIES') == $string);
  165. //var_dump($res);
  166. }
  167. public function test_api_html_entity_decode() {
  168. $string = 'áéíóú@/\!?Ç´`+*?-_ '; // UTF-8
  169. $quote_style = ENT_QUOTES;
  170. $encoding = 'UTF-8';
  171. $res = api_html_entity_decode(api_convert_encoding($string, 'HTML-ENTITIES', $encoding), $quote_style, $encoding);
  172. $this->assertTrue(is_string($res));
  173. $this->assertTrue($res == $string);
  174. //var_dump($res);
  175. }
  176. public function test_api_xml_http_response_encode() {
  177. $string='áéíóú@/\!?Ç´`+*?-_'; // UTF-8
  178. $from_encoding = 'UTF-8';
  179. $res = api_xml_http_response_encode($string, $from_encoding);
  180. $this->assertTrue(is_string($res));
  181. //var_dump($res);
  182. }
  183. public function test_api_transliterate() {
  184. $string = 'Фёдор Михайлович Достоевкий'; // UTF-8
  185. /*
  186. // If you have broken by mistake UTF-8 encoding of this source, try the following equivalent:
  187. $string = api_html_entity_decode(
  188. '&#1060;&#1105;&#1076;&#1086;&#1088; '.
  189. '&#1052;&#1080;&#1093;&#1072;&#1081;&#1083;&#1086;&#1074;&#1080;&#1095; '.
  190. '&#1044;&#1086;&#1089;&#1090;&#1086;&#1077;&#1074;&#1082;&#1080;&#1081;',
  191. ENT_QUOTES, 'UTF-8');
  192. */
  193. $unknown = 'X';
  194. $from_encoding = 'UTF-8';
  195. $res = api_transliterate($string, $unknown, $from_encoding);
  196. $this->assertTrue($res);
  197. $this->assertTrue(is_string($res));
  198. $this->assertTrue($res == 'Fyodor Mihaylovich Dostoevkiy');
  199. //var_dump($string);
  200. //var_dump($res);
  201. }
  202. /**
  203. * ----------------------------------------------------------------------------
  204. * Common multibyte string functions
  205. * ----------------------------------------------------------------------------
  206. */
  207. public function test_api_ord() {
  208. $encoding = 'UTF-8';
  209. $characters = array('И', 'в', 'а', 'н', ' ', 'I', 'v', 'a', 'n'); // UTF-8
  210. $codepoints = array(1048, 1074, 1072, 1085, 32, 73, 118, 97, 110);
  211. $res = array();
  212. foreach ($characters as $character) {
  213. $res[] = api_ord($character, $encoding);
  214. }
  215. $this->assertTrue($res == $codepoints);
  216. //var_dump($res);
  217. }
  218. public function test_api_str_ireplace() {
  219. $search = 'Á'; // UTF-8
  220. $replace = 'a';
  221. $subject = 'bájando'; // UTF-8
  222. $count = null;
  223. $encoding = 'UTF-8';
  224. $res = api_str_ireplace($search, $replace, $subject, & $count, $encoding);
  225. $this->assertTrue($res);
  226. $this->assertTrue(is_string($res));
  227. $this->assertTrue($res == 'bajando');
  228. //var_dump($res);
  229. }
  230. public function test_api_str_split() {
  231. $string = 'áéíóúº|\/?Ç][ç]'; // UTF-8
  232. $split_length = 1;
  233. $encoding = 'UTF-8';
  234. $res = api_str_split($string, $split_length, $encoding);
  235. $this->assertTrue(is_array($res));
  236. $this->assertTrue(count($res) == 15);
  237. //var_dump($res);
  238. }
  239. public function test_api_stripos() {
  240. $haystack = 'bájando'; // UTF-8
  241. $needle = 'Á';
  242. $offset = 0;
  243. $encoding = 'UTF-8';
  244. $res = api_stripos($haystack, $needle, $offset, $encoding);
  245. $this->assertTrue(is_numeric($res)|| is_bool($res));
  246. $this->assertTrue($res == 1);
  247. //var_dump($res);
  248. }
  249. public function test_api_stristr() {
  250. $haystack = 'bájando'; // UTF-8
  251. $needle = 'Á';
  252. $part = false;
  253. $encoding = 'UTF-8';
  254. $res = api_stristr($haystack, $needle, $part, $encoding);
  255. $this->assertTrue(is_bool($res) || is_string($res));
  256. $this->assertTrue($res == 'ájando');
  257. //var_dump($res);
  258. }
  259. public function test_api_strlen() {
  260. $string='áéíóúº|\/?Ç][ç]'; // UTF-8
  261. $encoding = 'UTF-8';
  262. $res = api_strlen($string, $encoding);
  263. $this->assertTrue(is_numeric($res));
  264. $this->assertTrue($res == 15);
  265. //var_dump($res);
  266. }
  267. public function test_api_strpos() {
  268. $haystack = 'bájando'; // UTF-8
  269. $needle = 'á';
  270. $offset = 0;
  271. $encoding = 'UTF-8';
  272. $res = api_strpos($haystack, $needle, $offset, $encoding);
  273. $this->assertTrue(is_numeric($res)|| is_bool($res));
  274. $this->assertTrue($res == 1);
  275. //var_dump($res);
  276. }
  277. public function test_api_strrchr() {
  278. $haystack = 'aviación aviación'; // UTF-8
  279. $needle = 'ó';
  280. $part = false;
  281. $encoding = 'UTF-8';
  282. $res = api_strrchr($haystack, $needle, $part, $encoding);
  283. $this->assertTrue(is_string($res)|| is_bool($res));
  284. $this->assertTrue($res == 'ón');
  285. //var_dump($res);
  286. }
  287. public function test_api_strrev() {
  288. $string = 'áéíóúº|\/?Ç][ç]'; // UTF-8
  289. $encoding = 'UTF-8';
  290. $res = api_strrev($string, $encoding);
  291. $this->assertTrue(is_string($res));
  292. $this->assertTrue($res == ']ç[]Ç?/\|ºúóíéá');
  293. //var_dump($res);
  294. }
  295. public function test_api_strripos() {
  296. $haystack = 'aviación aviación'; // UTF-8
  297. $needle = 'Ó';
  298. $offset = 0;
  299. $encoding = 'UTF-8';
  300. $res = api_strripos($haystack, $needle, $offset, $encoding);
  301. $this->assertTrue(is_numeric($res) || is_bool($res));
  302. $this->assertTrue($res == 15);
  303. //var_dump($res);
  304. }
  305. public function test_api_strrpos() {
  306. $haystack = 'aviación aviación'; // UTF-8
  307. $needle = 'ó';
  308. $offset = 0;
  309. $encoding = 'UTF-8';
  310. $res = api_strrpos($haystack, $needle, $offset, $encoding);
  311. $this->assertTrue(is_numeric($res) || is_bool($res));
  312. $this->assertTrue($res == 15);
  313. //var_dump($res);
  314. }
  315. public function test_api_strstr() {
  316. $haystack = 'aviación'; // UTF-8
  317. $needle = 'ó';
  318. $part = false;
  319. $encoding = 'UTF-8';
  320. $res = api_strstr($haystack, $needle, $part, $encoding);
  321. $this->assertTrue(is_bool($res)|| is_string($res));
  322. $this->assertTrue($res == 'ón');
  323. //var_dump($res);
  324. }
  325. public function test_api_strtolower() {
  326. $string = 'áéíóúº|\/?Ç][ç]'; // UTF-8
  327. $encoding = 'UTF-8';
  328. $res = api_strtolower($string, $encoding);
  329. $this->assertTrue(is_string($res));
  330. $this->assertTrue($res == 'áéíóúº|\/?ç][ç]');
  331. //var_dump($res);
  332. }
  333. public function test_api_strtoupper() {
  334. $string='áéíóúº|\/?Ç][ç]'; // UTF-8
  335. $encoding = 'UTF-8';
  336. $res = api_strtoupper($string, $encoding);
  337. $this->assertTrue(is_string($res));
  338. $this->assertTrue($res =='ÁÉÍÓÚº|\/?Ç][Ç]');
  339. //var_dump($res);
  340. }
  341. public function test_api_substr() {
  342. $string = 'áéíóúº|\/?Ç][ç]'; // UTF-8
  343. $start = 10;
  344. $length = 4;
  345. $encoding = 'UTF-8';
  346. $res = api_substr($string, $start, $length, $encoding);
  347. $this->assertTrue(is_string($res));
  348. $this->assertTrue($res == 'Ç][ç');
  349. //var_dump($res);
  350. }
  351. public function test_api_substr_replace() {
  352. $string = 'áéíóúº|\/?Ç][ç]'; // UTF-8
  353. $replacement = 'eiou';
  354. $start= 1;
  355. $length = 4;
  356. $encoding = 'UTF-8';
  357. $res = api_substr_replace($string, $replacement, $start, $length, $encoding);
  358. $this->assertTrue(is_string($res));
  359. $this->assertTrue($res == 'áeiouº|\/?Ç][ç]');
  360. //var_dump($res);
  361. }
  362. public function test_api_ucfirst() {
  363. $string = 'áéíóúº|\/? xx ][ xx ]'; // UTF-8
  364. $encoding = 'UTF-8';
  365. $res = api_ucfirst($string, $encoding);
  366. $this->assertTrue($res);
  367. $this->assertTrue(is_string($res));
  368. $this->assertTrue($res == 'Áéíóúº|\/? xx ][ xx ]');
  369. //var_dump($res);
  370. }
  371. public function test_api_ucwords() {
  372. $string = 'áéíóúº|\/? xx ][ xx ]'; // UTF-8
  373. $encoding = 'UTF-8';
  374. $res = api_ucwords($string, $encoding);
  375. $this->assertTrue($res);
  376. $this->assertTrue(is_string($res));
  377. $this->assertTrue($res == 'Áéíóúº|\/? Xx ][ Xx ]');
  378. //var_dump($res);
  379. }
  380. /**
  381. * ----------------------------------------------------------------------------
  382. * String operations using regular expressions
  383. * ----------------------------------------------------------------------------
  384. */
  385. public function test_api_preg_match() {
  386. $pattern = '/иван/i'; // UTF-8
  387. $subject = '-- Ivan (en) -- Иван (bg) --'; // UTF-8
  388. $matches = null;
  389. $flags = 0;
  390. $offset = 0;
  391. $encoding = 'UTF-8';
  392. $res = api_preg_match($pattern, $subject, $matches, $flags, $offset, $encoding);
  393. $this->assertTrue($res == 1);
  394. //var_dump($res);
  395. //var_dump($matches);
  396. }
  397. public function test_api_preg_match_all() {
  398. $pattern = '/иван/i'; // UTF-8
  399. $subject = '-- Ivan (en) -- Иван (bg) -- иван --'; // UTF-8
  400. $matches = null;
  401. $flags = PREG_PATTERN_ORDER;
  402. $offset = 0;
  403. $encoding = 'UTF-8';
  404. $res = api_preg_match_all($pattern, $subject, $matches, $flags, $offset, $encoding);
  405. $this->assertTrue($res == 2);
  406. //var_dump($res);
  407. //var_dump($matches);
  408. }
  409. public function test_api_preg_replace() {
  410. $pattern = '/иван/i'; // UTF-8
  411. $replacement = 'ИВАН'; // UTF-8
  412. $subject = '-- Ivan (en) -- Иван (bg) -- иван --'; // UTF-8
  413. $limit = -1;
  414. $count = null;
  415. $encoding = 'UTF-8';
  416. $res = api_preg_replace($pattern, $replacement, $subject, $limit, $count, $encoding);
  417. $this->assertTrue($res == '-- Ivan (en) -- ИВАН (bg) -- ИВАН --'); // UTF-8
  418. //var_dump($res);
  419. }
  420. public function test_api_preg_split() {
  421. $pattern = '/иван/i'; // UTF-8
  422. $subject = '-- Ivan (en) -- Иван (bg) -- иван --'; // UTF-8
  423. $limit = -1;
  424. $count = null;
  425. $encoding = 'UTF-8';
  426. $res = api_preg_split($pattern, $subject, $limit, $count, $encoding);
  427. $this->assertTrue($res[0] == '-- Ivan (en) -- '); // UTF-8
  428. //var_dump($res);
  429. }
  430. /**
  431. * ----------------------------------------------------------------------------
  432. * Obsolete string operations using regular expressions, to be deprecated
  433. * ----------------------------------------------------------------------------
  434. */
  435. public function test_api_ereg() {
  436. $pattern = 'scorm/showinframes.php([^"\'&]*)(&|&amp;)file=([^"\'&]*)$';
  437. $string = 'http://localhost/dokeos/main/scorm/showinframes.php?id=5&amp;file=test.php';
  438. $regs = array();
  439. $res = api_ereg($pattern, $string, $regs);
  440. $this->assertTrue(is_numeric($res));
  441. //var_dump($regs);
  442. //var_dump($res);
  443. }
  444. public function test_api_eregi() {
  445. $pattern = 'scorm/showinframes.php([^"\'&]*)(&|&amp;)file=([^"\'&]*)$';
  446. $string = 'http://localhost/dokeos/main/scorm/showinframes.php?id=5&amp;file=test.php';
  447. $regs = array();
  448. $res = api_eregi($pattern, $string, $regs);
  449. $this->assertTrue(is_numeric($res));
  450. //var_dump($regs);
  451. //var_dump($res);
  452. }
  453. /**
  454. * ----------------------------------------------------------------------------
  455. * String comparison
  456. * ----------------------------------------------------------------------------
  457. */
  458. public function test_api_strcasecmp() {
  459. $string1 = 'áéíóu'; // UTF-8
  460. $string2 = 'Áéíóu'; // UTF-8
  461. $language = 'english';
  462. $encoding = 'UTF-8';
  463. $res = api_strcasecmp($string1, $string2, $language, $encoding);
  464. $this->assertTrue(is_numeric($res));
  465. $this->assertTrue($res == 0);
  466. //var_dump($res);
  467. }
  468. public function test_api_strcmp() {
  469. $string1 = 'áéíóu'; // UTF-8
  470. $string2 = 'Áéíóu'; // UTF-8
  471. $language = 'english';
  472. $encoding = 'UTF-8';
  473. $res = api_strcmp($string1, $string2, $language, $encoding);
  474. $this->assertTrue(is_numeric($res));
  475. $this->assertTrue($res == 1);
  476. //var_dump($res);
  477. }
  478. public function test_api_strnatcmp() {
  479. $string1 = '201áéíóu.txt'; // UTF-8
  480. $string2 = '30áéíóu.TXT'; // UTF-8
  481. $language = 'english';
  482. $encoding = 'UTF-8';
  483. $res = api_strnatcmp($string1, $string2, $language, $encoding);
  484. $this->assertTrue(is_numeric($res));
  485. $this->assertTrue($res == 1);
  486. //var_dump($res);
  487. }
  488. /**
  489. * ----------------------------------------------------------------------------
  490. * Sorting arrays
  491. * ----------------------------------------------------------------------------
  492. */
  493. public function test_api_natsort() {
  494. $array = array('img12.png', 'img10.png', 'img2.png', 'img1.png'); // UTF-8
  495. $language = 'english';
  496. $encoding = 'UTF-8';
  497. $res = api_natsort($array, $language, $encoding);
  498. $keys = array_keys($array);
  499. $this->assertTrue(is_bool($res));
  500. $this->assertTrue($array[$keys[0]] == 'img1.png');
  501. //var_dump($array);
  502. //var_dump($res);
  503. }
  504. public function test_api_natrsort() {
  505. $array = array('img2.png', 'img10.png', 'img12.png', 'img1.png'); // UTF-8
  506. $language = 'english';
  507. $encoding = 'UTF-8';
  508. $res = api_natrsort($array, $language, $encoding);
  509. $keys = array_keys($array);
  510. $this->assertTrue(is_bool($res));
  511. $this->assertTrue($array[$keys[0]] == 'img12.png');
  512. //var_dump($array);
  513. //var_dump($res);
  514. }
  515. /**
  516. * ----------------------------------------------------------------------------
  517. * Encoding management functions
  518. * ----------------------------------------------------------------------------
  519. */
  520. public function test_api_refine_encoding_id() {
  521. $encoding = 'koI8-r';
  522. $res = api_refine_encoding_id($encoding);
  523. $this->assertTrue($res);
  524. $this->assertTrue(is_string($res));
  525. $this->assertTrue($res == 'KOI8-R');
  526. //var_dump($res);
  527. }
  528. public function test_api_equal_encodings() {
  529. $encoding1 = 'cp65001';
  530. $encoding2 = 'utf-8';
  531. $encoding3 = 'WINDOWS-1251';
  532. $encoding4 = 'WINDOWS-1252';
  533. $encoding5 = 'win-1250';
  534. $encoding6 = 'windows-1250';
  535. $res1 = api_equal_encodings($encoding1, $encoding2);
  536. $res2 = api_equal_encodings($encoding3, $encoding4);
  537. $res3 = api_equal_encodings($encoding5, $encoding6);
  538. $res4 = api_equal_encodings($encoding5, $encoding6, true);
  539. $this->assertTrue(is_bool($res1));
  540. $this->assertTrue(is_bool($res2));
  541. $this->assertTrue(is_bool($res3));
  542. $this->assertTrue(is_bool($res4));
  543. $this->assertTrue($res1);
  544. $this->assertTrue(!$res2);
  545. $this->assertTrue($res3);
  546. $this->assertTrue(!$res4);
  547. //var_dump($res1);
  548. //var_dump($res2);
  549. //var_dump($res3);
  550. //var_dump($res4);
  551. }
  552. public function test_api_is_utf8() {
  553. $encoding = 'cp65001'; // This an alias of UTF-8.
  554. $res = api_is_utf8($encoding);
  555. $this->assertTrue(is_bool($res));
  556. $this->assertTrue($res);
  557. //var_dump($res);
  558. }
  559. public function test_api_is_latin1() {
  560. $encoding = 'ISO-8859-15';
  561. $strict = false;
  562. $res = api_is_latin1($encoding, false);
  563. $this->assertTrue(is_bool($res));
  564. $this->assertTrue($res);
  565. //var_dump($res);
  566. }
  567. public function test_api_get_system_encoding() {
  568. $res = api_get_system_encoding();
  569. $this->assertTrue(is_string($res));
  570. $this->assertTrue($res);
  571. //var_dump($res);
  572. }
  573. public function test_api_is_encoding_supported() {
  574. $encoding1 = 'UTF-8';
  575. $encoding2 = 'XXXX#%#%VR^%BBDNdjlrsg;d';
  576. $res1 = api_is_encoding_supported($encoding1);
  577. $res2 = api_is_encoding_supported($encoding2);
  578. $this->assertTrue(is_bool($res1) && is_bool($res2));
  579. $this->assertTrue($res1 && !$res2);
  580. //var_dump($res1);
  581. //var_dump($res2);
  582. }
  583. public function test_api_get_non_utf8_encoding() {
  584. $language = 'bulgarian';
  585. $res = api_get_non_utf8_encoding($language);
  586. $this->assertTrue($res);
  587. $this->assertTrue(is_string($res));
  588. $this->assertTrue($res == 'WINDOWS-1251');
  589. //var_dump($res);
  590. }
  591. public function test_api_get_valid_encodings() {
  592. $res = api_get_valid_encodings();
  593. $ok = is_array($res) && !empty($res);
  594. $this->assertTrue($ok);
  595. if ($ok) {
  596. foreach ($res as $value) {
  597. $ok = $ok && is_string($value);
  598. }
  599. $this->assertTrue($ok);
  600. }
  601. //var_dump($res);
  602. }
  603. public function test_api_detect_encoding_html() {
  604. $meta = '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />'."\n";
  605. $head1 = '<head>'."\n".'<title>Sample Document</title>'."\n".'</head>'."\n";
  606. $head2 = '<head>'."\n".'<title>Sample Document</title>'."\n".$meta.'</head>'."\n";
  607. $body1 = '<p>This is a sample document for testing encoding detection.</p>'."\n";
  608. $body2 = '<body>'."\n".$body1.'</body>';
  609. $html1 = $body1; // A html-snippet, see for example some log-files created by the "Chat" tool.
  610. $html2 = '<html>'."\n".$head1.$body2."\n".'</html>'; // A full html-document, no encoding has been declared.
  611. $html3 = '<html>'."\n".$head2.$body2."\n".'</html>'; // A full html-document, encoding has been declared.
  612. $res1 = api_detect_encoding_html($html1);
  613. $res2 = api_detect_encoding_html($html2);
  614. $res3 = api_detect_encoding_html($html3);
  615. $this->assertTrue(
  616. $res1 === 'UTF-8'
  617. && $res2 === 'UTF-8'
  618. && $res3 === 'ISO-8859-15'
  619. );
  620. //var_dump($res1);
  621. //var_dump($res2);
  622. //var_dump($res3);
  623. }
  624. public function test_api_detect_encoding_xml() {
  625. $xml1 = '
  626. <Users>
  627. <User>
  628. <Username>username1</Username>
  629. <Lastname>xxx</Lastname>
  630. <Firstname>xxx</Firstname>
  631. <Password>xxx</Password>
  632. <Email>xxx@xx.xx</Email>
  633. <OfficialCode>xxx</OfficialCode>
  634. <Phone>xxx</Phone>
  635. <Status>student</Status>
  636. </User>
  637. </Users>'; // US-ASCII
  638. $xml2 = '<?xml version="1.0" encoding="ISO-8859-15"?>'.$xml1;
  639. $xml3 = '<?xml version="1.0" encoding="utf-8"?>'.$xml1;
  640. $xml4 = str_replace('<Lastname>xxx</Lastname>', '<Lastname>x'.chr(192).'x</Lastname>', $xml1); // A non-UTF-8 character has been inserted.
  641. $res1 = api_detect_encoding_xml($xml1);
  642. $res2 = api_detect_encoding_xml($xml2);
  643. $res3 = api_detect_encoding_xml($xml3);
  644. $res4 = api_detect_encoding_xml($xml4);
  645. $res5 = api_detect_encoding_xml($xml4, 'windows-1251');
  646. $this->assertTrue(
  647. $res1 === 'UTF-8'
  648. && $res2 === 'ISO-8859-15'
  649. && $res3 === 'UTF-8'
  650. && api_equal_encodings($res4, api_get_system_encoding())
  651. && $res5 === 'WINDOWS-1251'
  652. );
  653. //var_dump($res1);
  654. //var_dump($res2);
  655. //var_dump($res3);
  656. //var_dump($res4);
  657. //var_dump($res5);
  658. }
  659. public function test_api_convert_encoding_xml() {
  660. $xml = '
  661. <?xml version="1.0" encoding="UTF-8"?>
  662. <Users>
  663. <User>
  664. <Username>username1</Username>
  665. <Lastname>xxx</Lastname>
  666. <Firstname>Иван</Firstname>
  667. <Password>xxx</Password>
  668. <Email>xxx@xx.xx</Email>
  669. <OfficialCode>xxx</OfficialCode>
  670. <Phone>xxx</Phone>
  671. <Status>student</Status>
  672. </User>
  673. </Users>'; // UTF-8
  674. $res1 = api_convert_encoding_xml($xml, 'WINDOWS-1251', 'UTF-8');
  675. $res2 = api_convert_encoding_xml($xml, 'WINDOWS-1251');
  676. $res3 = api_convert_encoding_xml($res1, 'UTF-8', 'WINDOWS-1251');
  677. $res4 = api_convert_encoding_xml($res2, 'UTF-8');
  678. $this->assertTrue(
  679. $res3 === $xml
  680. && $res4 === $xml
  681. );
  682. //var_dump(preg_replace(array('/\r?\n/m', '/\t/m'), array('<br />', '&nbsp;&nbsp;&nbsp;&nbsp;'), htmlspecialchars($res1)));
  683. //var_dump(preg_replace(array('/\r?\n/m', '/\t/m'), array('<br />', '&nbsp;&nbsp;&nbsp;&nbsp;'), htmlspecialchars($res2)));
  684. //var_dump(preg_replace(array('/\r?\n/m', '/\t/m'), array('<br />', '&nbsp;&nbsp;&nbsp;&nbsp;'), htmlspecialchars($res3)));
  685. //var_dump(preg_replace(array('/\r?\n/m', '/\t/m'), array('<br />', '&nbsp;&nbsp;&nbsp;&nbsp;'), htmlspecialchars($res4)));
  686. }
  687. public function test_api_utf8_encode_xml() {
  688. $xml1 = '
  689. <?xml version="1.0" encoding="UTF-8"?>
  690. <Users>
  691. <User>
  692. <Username>username1</Username>
  693. <Lastname>xxx</Lastname>
  694. <Firstname>Иван</Firstname>
  695. <Password>xxx</Password>
  696. <Email>xxx@xx.xx</Email>
  697. <OfficialCode>xxx</OfficialCode>
  698. <Phone>xxx</Phone>
  699. <Status>student</Status>
  700. </User>
  701. </Users>'; // UTF-8
  702. $xml2 = '
  703. <?xml version="1.0" encoding="WINDOWS-1251"?>
  704. <Users>
  705. <User>
  706. <Username>username1</Username>
  707. <Lastname>xxx</Lastname>
  708. <Firstname>'.chr(200).chr(226).chr(224).chr(237).'</Firstname>
  709. <Password>xxx</Password>
  710. <Email>xxx@xx.xx</Email>
  711. <OfficialCode>xxx</OfficialCode>
  712. <Phone>xxx</Phone>
  713. <Status>student</Status>
  714. </User>
  715. </Users>'; // WINDOWS-1251
  716. $res1 = api_utf8_encode_xml($xml2);
  717. $this->assertTrue($res1 === $xml1);
  718. //var_dump(preg_replace(array('/\r?\n/m', '/\t/m'), array('<br />', '&nbsp;&nbsp;&nbsp;&nbsp;'), htmlspecialchars($res1)));
  719. }
  720. public function test_api_utf8_decode_xml() {
  721. $xml1 = '
  722. <?xml version="1.0" encoding="UTF-8"?>
  723. <Users>
  724. <User>
  725. <Username>username1</Username>
  726. <Lastname>xxx</Lastname>
  727. <Firstname>Иван</Firstname>
  728. <Password>xxx</Password>
  729. <Email>xxx@xx.xx</Email>
  730. <OfficialCode>xxx</OfficialCode>
  731. <Phone>xxx</Phone>
  732. <Status>student</Status>
  733. </User>
  734. </Users>'; // UTF-8
  735. $xml2 = '
  736. <?xml version="1.0" encoding="WINDOWS-1251"?>
  737. <Users>
  738. <User>
  739. <Username>username1</Username>
  740. <Lastname>xxx</Lastname>
  741. <Firstname>'.chr(200).chr(226).chr(224).chr(237).'</Firstname>
  742. <Password>xxx</Password>
  743. <Email>xxx@xx.xx</Email>
  744. <OfficialCode>xxx</OfficialCode>
  745. <Phone>xxx</Phone>
  746. <Status>student</Status>
  747. </User>
  748. </Users>'; // WINDOWS-1251
  749. $res1 = api_utf8_decode_xml($xml1, 'WINDOWS-1251');
  750. $this->assertTrue($res1 === $xml2);
  751. //var_dump(preg_replace(array('/\r?\n/m', '/\t/m'), array('<br />', '&nbsp;&nbsp;&nbsp;&nbsp;'), htmlspecialchars($res1)));
  752. }
  753. /**
  754. * ----------------------------------------------------------------------------
  755. * String validation functions concerning certain encodings
  756. * ----------------------------------------------------------------------------
  757. */
  758. public function test_api_is_valid_utf8() {
  759. $string = 'áéíóú1@\/-ḉ`´';
  760. $res = api_is_valid_utf8($string);
  761. $this->assertTrue(is_bool($res));
  762. $this->assertTrue($res);
  763. //var_dump($res);
  764. }
  765. public function test_api_is_valid_ascii() {
  766. $string = 'áéíóú'; // UTF-8
  767. $res = api_is_valid_ascii($string);
  768. $this->assertTrue(is_bool($res));
  769. $this->assertTrue(!$res);
  770. //var_dump($res);
  771. }
  772. /**
  773. * ----------------------------------------------------------------------------
  774. * Language management functions
  775. * ----------------------------------------------------------------------------
  776. */
  777. public function test_api_is_language_supported() {
  778. $language1 = 'english';
  779. $language2 = 'english_org';
  780. $language3 = 'EnGlIsh';
  781. $language4 = 'EnGlIsh_oRg';
  782. $language5 = 'french';
  783. $language6 = 'french_corporate';
  784. $language7 = 'frEncH';
  785. $language8 = 'freNch_corPorAte';
  786. $language9 = 'xxxxxxxxxxxxxx';
  787. $res1 = api_is_language_supported($language1);
  788. $res2 = api_is_language_supported($language2);
  789. $res3 = api_is_language_supported($language3);
  790. $res4 = api_is_language_supported($language4);
  791. $res5 = api_is_language_supported($language5);
  792. $res6 = api_is_language_supported($language6);
  793. $res7 = api_is_language_supported($language7);
  794. $res8 = api_is_language_supported($language8);
  795. $res9 = api_is_language_supported($language9);
  796. $this->assertTrue(
  797. $res1 === true
  798. && $res2 === true
  799. && $res3 === true
  800. && $res4 === true
  801. && $res5 === true
  802. && $res6 === true
  803. && $res7 === true
  804. && $res8 === true
  805. && $res9 === false
  806. );
  807. //var_dump($res1);
  808. //var_dump($res2);
  809. //var_dump($res3);
  810. //var_dump($res4);
  811. //var_dump($res5);
  812. //var_dump($res6);
  813. //var_dump($res7);
  814. //var_dump($res8);
  815. //var_dump($res9);
  816. }
  817. public function test_api_get_valid_language() {
  818. $enabled_languages_info = api_get_languages();
  819. $enabled_languages = $enabled_languages_info['folder'];
  820. $language = array();
  821. $language[] = ' '.strtoupper(api_get_interface_language()).' ';
  822. $language[] = " \t ".strtoupper(api_get_setting('platformLanguage'))." \t ";
  823. $language[] = 'xxxxxxxxxxxxxx';
  824. $language[] = ' \t'.strtoupper('bulgarian').' ';
  825. $res = array();
  826. $res[] = api_get_valid_language($language[1]);
  827. $res[] = api_get_valid_language($language[2]);
  828. $res[] = api_get_valid_language($language[3]);
  829. $res[] = api_get_valid_language($language[4]);
  830. $expected = array();
  831. foreach ($language as $value) {
  832. $value = str_replace('_km', '_KM', strtolower(trim($value)));
  833. if (empty($value) || !in_array($value, $enabled_languages) || !api_is_language_supported($value)) {
  834. $value = api_get_setting('platformLanguage');
  835. }
  836. $expected = $value;
  837. }
  838. $is_ok = true;
  839. foreach ($language as $key => $value) {
  840. $is_ok = $is_ok && ($value === $res[$key]);
  841. }
  842. //var_dump($res);
  843. //var_dump($expected);
  844. }
  845. public function test_api_purify_language_id() {
  846. $language = 'english_org';
  847. $res = api_purify_language_id($language);
  848. $this->assertTrue(is_string($res));
  849. $this->assertTrue($res == 'english');
  850. //var_dump($res);
  851. }
  852. function test_api_get_language_isocode() {
  853. $test_language_table = array(
  854. '*** invalid entry ***' => 'en', // An invalid entry.
  855. 'arabic' => 'ar',
  856. 'arabic_unicode' => 'ar',
  857. 'asturian' => 'ast',
  858. 'bosnian' => 'bs',
  859. 'brazilian' => 'pt-BR',
  860. 'bulgarian' => 'bg',
  861. 'catalan' => 'ca',
  862. 'croatian' => 'hr',
  863. 'czech' => 'cs',
  864. 'danish' => 'da',
  865. 'dari' => 'prs',
  866. 'dutch' => 'nl',
  867. 'dutch_corporate' => 'nl',
  868. 'english' => 'en',
  869. 'english_org' => 'en',
  870. 'esperanto' => 'eo',
  871. 'basque' => 'eu',
  872. 'finnish' => 'fi',
  873. 'french' => 'fr',
  874. 'french_corporate' => 'fr',
  875. 'french_KM' => 'fr',
  876. 'french_org' => 'fr',
  877. 'french_unicode' => 'fr',
  878. 'friulian' => 'fur',
  879. 'galician' => 'gl',
  880. 'georgian' => 'ka',
  881. 'german' => 'de',
  882. 'greek' => 'el',
  883. 'hebrew' => 'he',
  884. 'hungarian' => 'hu',
  885. 'indonesian' => 'id',
  886. 'italian' => 'it',
  887. 'japanese' => 'ja',
  888. 'japanese_unicode' => 'ja',
  889. 'korean' => 'ko',
  890. 'latvian' => 'lv',
  891. 'lithuanian' => 'lt',
  892. 'macedonian' => 'mk',
  893. 'malay' => 'ms',
  894. 'norwegian' => 'no',
  895. 'occitan' => 'oc',
  896. 'pashto' => 'ps',
  897. 'persian' => 'fa',
  898. 'polish' => 'pl',
  899. 'portuguese' => 'pt',
  900. 'quechua_cusco' => 'qu',
  901. 'romanian' => 'ro',
  902. 'russian' => 'ru',
  903. 'russian_unicode' => 'ru',
  904. 'serbian' => 'sr',
  905. 'simpl_chinese' => 'zh',
  906. 'simpl_chinese_unicode' => 'zh',
  907. 'slovak' => 'sk',
  908. 'slovenian' => 'sl',
  909. 'slovenian_unicode' => 'sl',
  910. 'spanish' => 'es',
  911. 'spanish_latin' => 'es',
  912. 'swahili' => 'sw',
  913. 'swedish' => 'sv',
  914. 'thai' => 'th',
  915. 'trad_chinese' => 'zh-TW',
  916. 'trad_chinese_unicode' => 'zh-TW',
  917. 'turkish' => 'tr',
  918. 'ukrainian' => 'uk',
  919. 'vietnamese' => 'vi',
  920. 'yoruba' => 'yo'
  921. );
  922. $res = array();
  923. foreach ($test_language_table as $language => $expected_result) {
  924. $test_result = api_get_language_isocode($language);
  925. $res[$language] = array(
  926. 'expected_result' => $expected_result,
  927. 'test_result' => $test_result,
  928. 'is_ok' => $expected_result === $test_result
  929. );
  930. }
  931. $this->assertTrue(is_array($res));
  932. $is_ok = true;
  933. foreach ($res as $language => $test_case) {
  934. $is_ok = $is_ok && $test_case['is_ok'];
  935. }
  936. $this->assertTrue($is_ok);
  937. //var_dump($res);
  938. //foreach ($res as $language => $test_case) { echo ($test_case['is_ok'] ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' '.$language.' => '.(is_null($test_case['test_result']) ? 'NULL' : $test_case['test_result']).'<br />'; }
  939. }
  940. public function test_api_get_text_direction() {
  941. $languages = array('english', 'en', 'arabic', 'ar');
  942. $expected_results = array('ltr', 'ltr', 'rtl', 'rtl');
  943. $res = array();
  944. foreach ($languages as $language) {
  945. $res[] = api_get_text_direction($language);
  946. }
  947. $this->assertTrue($res === $expected_results);
  948. //var_dump($res);
  949. }
  950. /*
  951. // This test works. It has been disabled, because it is time-consuming.
  952. public function test_api_detect_encoding() {
  953. $strings = $this->language_strings;
  954. $is_test_ok = true;
  955. foreach ($strings as $language => $string) {
  956. if (api_is_language_supported($language)) {
  957. $is_ok = api_is_utf8(api_detect_encoding($string)); // Checking whether the input string is UTF-8.
  958. $is_test_ok = $is_test_ok && $is_ok;
  959. $non_utf8_encoding = api_get_non_utf8_encoding($language);
  960. if (!empty($non_utf8_encoding) && api_is_encoding_supported($non_utf8_encoding)) {
  961. $res = api_detect_encoding(api_utf8_decode($string, $non_utf8_encoding));
  962. $test_string = api_utf8_encode(api_utf8_decode($string, $non_utf8_encoding), $res);
  963. $is_ok = api_equal_encodings($non_utf8_encoding, $res) || $string == $test_string;
  964. echo $language.'<br />';
  965. echo $string.'<br />';
  966. echo $test_string.'<br />';
  967. echo ($is_ok ? '<span style="color: green; font-weight: bold;">Ok</span>' : '<span style="color: red; font-weight: bold;">Failed</span>').' '.$non_utf8_encoding.' => <strong>'.$res.'</strong><br />';
  968. echo '<br />';
  969. } else {
  970. $is_ok = true;
  971. }
  972. $is_test_ok = $is_test_ok && $is_ok;
  973. }
  974. }
  975. $this->assertTrue($is_test_ok);
  976. }
  977. */
  978. // The second function for testing api_detect_encoding().
  979. public function test_api_detect_encoding_2() {
  980. $string_utf8 = 'Това е тест на български език'; // Bulgarian language, UTF-8
  981. $string_utf8_broken = $string_utf8.chr(198); // Intentionaly broken UTF-8, it should be detected as UTF-8
  982. $res1 = api_detect_encoding($string_utf8, 'bulgarian');
  983. $res2 = api_detect_encoding($string_utf8_broken, 'bulgarian');
  984. $this->assertTrue(api_is_utf8($res1) && api_is_utf8($res2));
  985. //var_dump($res1);
  986. //var_dump($res2);
  987. }
  988. public function test_api_get_local_time_with_datetime() {
  989. $datetime_not_converted = '2010-03-13 16:24:02';
  990. $datetime_gmtplus1 = api_get_local_time($datetime_not_converted, 'Europe/Paris', 'America/Lima');
  991. $this->assertEqual($datetime_gmtplus1, '2010-03-13 22:24:02');
  992. }
  993. public function test_api_get_local_time_with_timestamp() {
  994. $current_timestamp = time();
  995. $datetime = api_get_local_time($current_timestamp, 'Europe/Paris');
  996. $system_timezone = date_default_timezone_get();
  997. date_default_timezone_set('Europe/Paris');
  998. $this->assertEqual($datetime, date('Y-m-d H:i:s', $current_timestamp));
  999. date_default_timezone_set($system_timezone);
  1000. }
  1001. public function test_api_get_utc_datetime_with_string() {
  1002. $timestamp = time();
  1003. $timezone = _api_get_timezone();
  1004. $system_timezone = date_default_timezone_get();
  1005. date_default_timezone_set($timezone);
  1006. $datetime = date('Y-m-d H:i:s', $timestamp);
  1007. $datetime_utc = api_get_utc_datetime($datetime);
  1008. $this->assertEqual($datetime_utc, gmdate('Y-m-d H:i:s', $timestamp));
  1009. date_default_timezone_set($system_timezone);
  1010. }
  1011. public function test_api_get_utc_datetime_with_timestamp() {
  1012. $timestamp = time();
  1013. $this->assertEqual(api_get_utc_datetime($timestamp), gmdate("Y-m-d H:i:s", $timestamp));
  1014. }
  1015. /*
  1016. // Enable the following test when you need to run it.
  1017. // Testing whether all the language files load successfully. This means that their php-syntax is correct.
  1018. public function test_all_the_language_files() {
  1019. $files = array( // Only files with these names will be loaded/tested.
  1020. 'trad4all.inc.php',
  1021. );
  1022. $languages = test_get_language_folder_list();
  1023. $lang_dir = api_get_path(SYS_LANG_PATH);
  1024. foreach ($languages as $language) {
  1025. echo 'Language: <strong>'.ucwords($language).'</strong><br />';
  1026. echo '-------------------------------------------------------------------------<br />';
  1027. foreach ($files as $file) {
  1028. echo 'Loading '.$lang_dir.$language.'/<strong>'.$file.'</strong> ...<br />';
  1029. test_load_php_language_file($lang_dir.$language.'/'.$file);
  1030. }
  1031. echo '<br />';
  1032. }
  1033. $this->assertTrue(true); // Once we arrived here, the test is Ok.
  1034. }
  1035. */
  1036. }
  1037. // An isolated namespace for testing whether language files load successfully.
  1038. function test_load_php_language_file($filename) {
  1039. include $filename;
  1040. }
  1041. // A helper function.
  1042. function test_get_language_folder_list() {
  1043. $result = array();
  1044. $exceptions = array('.', '..', 'CVS', '.svn');
  1045. $dirname = api_get_path(SYS_LANG_PATH);
  1046. $handle = opendir($dirname);
  1047. while ($entries = readdir($handle)) {
  1048. if (in_array($entries, $exceptions)) {
  1049. continue;
  1050. }
  1051. if (is_dir($dirname.$entries)) {
  1052. $result[] = $entries;
  1053. }
  1054. }
  1055. closedir($handle);
  1056. sort($result);
  1057. return $result;
  1058. }
  1059. ?>