12 #include "absl/strings/str_format.h"
18 #ifdef INCLUDE_TENSORFLOW
27 #if defined(MISSING_CODE)
30 return std::string(uni_ch.utf8(), uni_ch.utf8_len());
34 TEST(NormstrngsTest, BasicText) {
35 const char* kBasicText =
"AbCd Ef";
40 EXPECT_STREQ(kBasicText, result.c_str());
43 TEST(NormstrngsTest, LigatureText) {
44 const char* kTwoByteLigText =
"ij";
49 EXPECT_STREQ(
"ij", result.c_str());
51 const char* kThreeByteLigText =
"finds";
55 EXPECT_STREQ(
"finds", result.c_str());
58 TEST(NormstrngsTest, OcrSpecificNormalization) {
59 const char* kSingleQuoteText =
"‘Hi";
64 EXPECT_STREQ(
"'Hi", result.c_str());
66 const char* kDoubleQuoteText =
"“Hi";
70 EXPECT_STREQ(
"\"Hi", result.c_str());
72 const char* kEmDash =
"Hi—";
75 EXPECT_STREQ(
"Hi-", result.c_str());
80 EXPECT_STREQ(kSingleQuoteText, result.c_str());
84 EXPECT_STREQ(kDoubleQuoteText, result.c_str());
87 EXPECT_STREQ(kEmDash, result.c_str());
91 const char kEngText[] =
"the quick brown fox jumps over the lazy dog";
92 const char kHinText[] =
"पिताने विवाह की | हो गई उद्विग्न वह सोचा";
93 const char kKorText[] =
"이는 것으로";
95 const char* kBadlyFormedHinWords[] = {
"उपयोक्ताो",
"नहीें",
"प्रंात",
96 "कहीअे",
"पत्रिाका",
"छह्णाीस"};
98 const char* kBadlyFormedThaiWords[] = {
"ฤิ",
"กา้ํ",
"กิำ",
"นำ้",
"เเก"};
100 TEST(NormstrngsTest, DetectsCorrectText) {
104 EXPECT_STREQ(kEngText, chars.c_str());
108 <<
"Incorrect text: '" << kHinText <<
"'";
109 EXPECT_STREQ(kHinText, chars.c_str());
113 EXPECT_STREQ(kKorText, chars.c_str());
116 TEST(NormstrngsTest, DetectsIncorrectText) {
117 for (
size_t i = 0; i <
ARRAYSIZE(kBadlyFormedHinWords); ++i) {
120 kBadlyFormedHinWords[i],
nullptr))
121 << kBadlyFormedHinWords[i];
123 for (
size_t i = 0; i <
ARRAYSIZE(kBadlyFormedThaiWords); ++i) {
126 kBadlyFormedThaiWords[i],
nullptr))
127 << kBadlyFormedThaiWords[i];
131 TEST(NormstrngsTest, NonIndicTextDoesntBreakIndicRules) {
138 EXPECT_EQ(
dest, nonindic);
141 TEST(NormstrngsTest, NoLonelyJoiners) {
143 std::vector<std::string> glyphs;
147 str.c_str(), &glyphs))
149 EXPECT_EQ(glyphs.size(), 3);
155 TEST(NormstrngsTest, NoLonelyJoinersPlus) {
157 std::vector<std::string> glyphs;
161 str.c_str(), &glyphs))
163 EXPECT_EQ(glyphs.size(), 3);
169 TEST(NormstrngsTest, NoLonelyJoinersNonAlpha) {
173 str =
"\u200d\u200c\u200d";
182 TEST(NormstrngsTest, JoinersStayInArabic) {
183 std::string str =
"\u0628\u200c\u0628\u200d\u0628";
188 TEST(NormstrngsTest, DigitOK) {
193 TEST(NormstrngsTest, DandaOK) {
200 TEST(NormstrngsTest, AllScriptsRegtest) {
203 const std::vector<std::pair<std::string, std::string>> kScriptText(
205 " فكان منهم علقمة بن قيس ، و إبراهيم النخعي ، و الأسود بن"
206 "توفي بالمدينة في هذه السنة وهو ابن مائة وعشرين سنة "
207 "مجموعه هیچ اثری در فنون هنر و ادب و ترجمه، تقدیم پیشگاه ارجمند "
208 "سازنده تاریخ نگاه میکرد و به اصطلاح انسان و فطرت انسانی را زیربنای"},
210 "անտիկ աշխարհի փիլիսոփաների կենսագրությունը, թե′ նրանց ուս-"
211 "պատրաստւում է դալ (բուլամա): Կովկասում կաթից նաև պատ-"
212 "Հոգաբարձութեան յղել այդ անձին յիմարութիւնը հաստա-"
213 "գծերը եւ միջագծերը կը համրուին վարէն վեր:"},
215 "এসে দাঁড়ায় দাও খানি উঁচিয়ে নিয়ে । ঝরনার স্বচ্ছ জলে প্রতিবিম্বিত "
216 "পাঠিয়ে, গোবিন্দ স্মরণ করে, নির্ভয়ে রওনা হয়েছিল। তাতে সে "
217 "সুলতার। মনে পড়ে বিয়ের সময় বাবা এদের বাড়ি থেকে ঘুরে "
218 "কিন্তু তারপর মাতৃহৃদয় কেমন করে আছে? কী"},
220 "достей, є ще нагороди й почесті, є хай і сумнівна, але слава, "
221 "вып., 96б). Параўн. найсвятший у 1 знач., насвятейший у 1 знач., "
222 "»Правді«, — гітлерівські окупанти винищували нижчі раси, після дру- "
223 "І знов майдан зачорнів од народу. Всередині чоло-"},
225 "डा॰ नै हात्तीमाथि चढेर त्यो भएनेर आइपुगे। राजालाई देखी "
226 "बाबतीत लिहिणे ही एक मोठीच जबाबदारी आहे. काकासाहेबांच्या कार्याचा "
227 "प्रबंध, आधोगिक प्रबंध तथा बैंकिंग एवम वाणिज्य आदि विषयों में "
228 "चित्रकृती दिल्या. शंभराहून अधिक देश आज आपापले चित्रपट निर्माण करीत"},
230 "Μέσα ένα τετράδιο είχα στριμώξει το πρώτο "
231 "νον αξίως τού ευαγγελίου τού χριστού πολιτεύεσθε, ίνα "
232 "οὐδεμία ὑπ' αὐτοῦ μνεία γίνεται τῶν οἰκείων χωρίων. "
233 "είτα την φάσιν αυτήν ην ούτος εποιήσατο κατά του Μίκω-"},
235 "ઉપહારગૃહે ને નાટ્યસ્થળે આ એ જ તેલ કડકડતું "
236 "શકી. ભાવવધારો અટકાવી નથી શકી અને બેકારીને "
237 "ત્યાં વાંકુથી પાછે આવ્યો, ચોરીનો માલ સોંપવા ! "
238 "કહી. એણે રેશમના કપડામાં વીંટી રાખેલ કુંવરીની છબી"},
240 "ਯਾਦ ਰਹੇ ਕਿ ‘ਨਫਰਤ ’ ਦਾ ਵਿਸ਼ਾ ਕ੍ਰਾਤੀ ਨਹੀ ਹੈ ਅਤੇ ਕਵੀ ਦੀ ਇਹ "
241 "ਮਹਾਂ ਨੰਦਾ ਕੋਲ ਇਕ ਚੀਜ਼ ਸੀ ਉਹ ਸੀ ਸਚ, ਕੋਰਾ ਸਚ, ਬੇਧਤ੍ਰਕ ਕਹਿੳ "
242 "ਭੂਰਾ ਸਾਨੂੰ ਥੜਾ ਚੰਗਾ ਲਗਦਾ ਸੀ । ਉਸ ਦਾ ਇਕ ਪੈਰ ਜਨਮ ਤੋ "
243 "ਨੂੰ ਇਹ ਅਧਿਕਾਰ ਦਿੱਤਾ ਕਿ ਉਹ ਸਿੱਖ ਵਿਰੋਧ ਦਾ ਸੰਗਠਨ ਕਰੇ ਅਤੇ 3 ਸਤੰਬਰ,"},
245 "로 들어갔다. 이대통령은 아이젠하워 대통령의 뒷모습을 보면서 "
246 "그것뿐인 줄 아요? 노름도 했다 캅니다. 빌어묵을 놈이 그러 "
247 "의 가장 과학적 태도이며, 우리 역사를 가장 정확하게 학습할 수 있는 "
249 "각하는 그는 그들의 식사보장을 위해 때때로 집에"},
251 "大凡世界上的先生可 分 三 种: 第一种只会教书, 只会拿一 "
252 "书像是探宝一样,在茶叶店里我买过西湖龙井﹑黄山毛峰﹑福建的铁观音﹑大红"
254 "持 “左” 倾冒险主义的干部,便扣上 “富农 "
255 "笑说:“我听说了,王总工程师也跟我说过了,只是工作忙,谁"},
258 "民國六十三年,申請就讀台灣大學歷史研究所,並從事著述,"
259 "質言之﹐在社會結構中﹐性質﹑特徵﹑地位相類似的一羣人﹐由於 "
260 "董橋,一九四二年生,福建晉江人,國立成功大學外"},
262 " אֵ-לִי, אֵ-לִי, כֵּיַצד מְטַפְּסִים בְּקִירוֹת שֶׁל זְכוּכִי"
263 " הראשון חוצה אותי שוב. אני בסיבוב הרביעי, הוא בטח מתחיל את"
264 " ווערטער געהאט, אבער דער עיקר איז ניט דאָס וואָרט, נאָר"
265 " על גחלת היהדות המקורית בעירך, נתת צביון ואופי מיוחד"},
267 "は異民族とみなされていた。楚の荘王(前613〜前 "
268 "を詳細に吟味する。実際の治療活動の領域は便宜上、(1) 障害者 "
269 "困難性は多角企業の場合原則として部門別に判断されている.). "
270 "☆ご希望の団体には見本をお送りします"},
272 "ಕೂಡ ಯುದ್ಧ ಮಾಡಿ ಜಯಪಡೆ. ನಂತರ ನಗರದೊಳಕ್ಕೆ ನಡೆ ಇದನ್ನು "
273 "ಅಸಹ್ಯದೃಶ್ಯ ಯಾರಿಗಾದರೂ ನಾಚಿಕೆತರುವಂತಹದಾಗಿದೆ. ಆರೋಗ್ಯ ದೃಷ್ಟಿ "
274 "ಯಾಗಲಿ, ಮೋಹನನಾಗಲಿ ಇಂಥ ಬಿಸಿಲಿನಲ್ಲಿ ಎಂದೂ ಬಹಳ ಹೊತ್ತು "
275 "\"ಇದೆ...ಖಂಡಿತಾ ಇದೆ\" ಅಂದ ಮನಸ್ಸಿನಲ್ಲಿಯೇ ವಂದಿಸುತ್ತಾ,"},
277 "សិតសក់និងផ្លាស់សម្លៀកបំពាក់ពេលយប់ចេញ។ "
278 "និយាយអំពីនគរនេះ ប្រាប់ដល់លោកទាំងមូលឲ្យដឹងច្បាស់លាស់អំពី "
279 "កន្លះកាថាសម្រាប់ទន្ទេញឲ្យងាយចាំ បោះពុម្ពនៅក្នុងទ្រង់ទ្រាយបច្ចុប្បន្ន "
280 "ឯកសារនេះបានផ្សព្វផ្សាយនៅក្នុងសន្និសីទ"},
282 "ເອີຍ ! ຟັງສຽງຟ້າມັນຮ້ອງຮ່ວນ ມັນດັງໄກໆ ເອີຍ "
283 "ໄດລຽງດູລາວມາດວບຄວາມລາບາກຫລາຍ; "
284 "ບາງໄດ້ ເຈົ້າລອງສູ້ບໍ່ໄດ້ຈຶ່ງຫນີລົງມາວຽງຈັນ. "
285 "ລົບອອກຈາກ 3 ເຫລືອ 1, ຂ້ອຍຂຽນ 1 (1)"},
287 "režisoru, palīdzēja to manu domīgo, kluso Dzejas metru ielikt "
288 "Ešte nedávno sa chcel mladý Novomeský „liečiť” "
289 "tiivisia kysymyksiä, mistä seuraa, että spekula- | don luonteesta "
290 "Grabiel Sanchez, yang bertani selama 120 tahun meninggal"},
292 "അമൂർത്തചിത്രമായിരിക്കും. ഛേ! ആ വീട്ടിലേക്ക് അവളൊന്നിച്ച് പോകേണ്ടതാ "
293 "മൃഗങ്ങൾക്ക് എന്തെക്കിലും പറ്റിയാൽ മാത്രം ഞാനതു "
294 "വെലക്ക് വേണമെങ്കിൽ തരാം. എന്തോ തരും? പറ. "
295 "എല്ലാം കഴിഞ്ഞ് സീനിയറിന്റെ അടുത്തു ചെന്ന് കാൽതൊട്ട"},
297 "பொருத்தமாகப் பாடினாள் நம் ஔவைப் பாட்டி. காவிரி "
298 "உள்ளடக்கி நிற்பது விநோத வார்த்தையின் அஃறிணை "
299 "சூரிய கிரஹண சமயத்தில் குருக்ஷேத்திரம் செல்வது "
300 "காலங்களில் வெளியே போகும்பொழுது, 'ஸார்', 'ஸார்',"},
302 "1892లో ఆమె 10వ సంవత్సరంలో గుంటూరు తాలూకా వేములాపాడు "
303 "ఫండ్స్ చట్టము'నందు చేయబడెను. తరువాత క్రీ. శ. "
304 "సంచారము చేయును. మీరు ఇప్పుడే కాళకాలయమునకు "
305 "ఎంతటి సరళమైన భాషలో వ్రాశాడో విశదమవుతుంది. పైగా ఆనాటి భాష"},
307 "อ้อ! กับนัง....แม่ยอดพระกลิ่น นั่นเอง ! หรับก็ย่อมจะรู้โดยชัดเจนว่า "
308 "ถ้าตราบใดยังมีเรือปืนอยู่ใกล้ ๆ แล้ว ตราบนั้น "
309 "พระดำรินี้ ที่มีคตีทำกรวยหมากและธูปเทียน "
310 "อันยานมีเรือเปนต้นฃ้ามยาก ฯ เพราะว่าแม่น้ำนั่นมีน้ำใสยิ่ง แม้เพียง"},
312 "vợ đến tai mụ hung thần Xăng-tô- mê-a. Mụ vô cùng "
313 "chiếc xe con gấu chạy qua nhà. Nhưng thỉnh thoảng "
314 "hòa hoãn với người Pháp để cho họ được dựng một ngôi nhà thờ nhỏ bằng "
315 "Cặp câu đói súc tích mà sâu sắc, là lời chúc lời"}});
317 for (
const auto& p : kScriptText) {
322 <<
"Script=" << p.first <<
" text=" << p.second;
333 for (
char32 ch = 0x2000; ch <= 0x200A; ++ch) {
334 SCOPED_TRACE(absl::StrFormat(
"Failed at U+%x", ch));
351 const char kHinText[] =
"पिताने विवाह";
352 const char kKorText[] =
"이는 것으로 다시 넣을";
353 const char kMixedText[] =
"والفكر 123 والصراع abc";
369 #ifdef INCLUDE_TENSORFLOW
370 const int32_t kMinUnicodeValue = 33;
371 const int32_t kMaxUnicodeValue = 0x10FFFF;
372 for (int32_t ch = kMinUnicodeValue; ch <= kMaxUnicodeValue; ++ch) {
373 SCOPED_TRACE(absl::StrFormat(
"Failed at U+%x", ch));
384 #if defined(MISSING_CODE) && defined(INCLUDE_TENSORFLOW)
385 const int32_t kMinUnicodeValue = 33;
386 const int32_t kMaxUnicodeValue = 0x10FFFF;
387 for (int32_t ch = kMinUnicodeValue; ch <= kMaxUnicodeValue; ++ch) {
388 SCOPED_TRACE(absl::StrFormat(
"Failed at U+%x", ch));
409 #if defined(MISSING_CODE) && defined(INCLUDE_TENSORFLOW)
411 const int32_t kMinUnicodeValue = 33;
412 const int32_t kMaxUnicodeValue = 0x10FFFF;
413 for (int32_t ch = kMinUnicodeValue; ch <= kMaxUnicodeValue; ++ch) {
415 SCOPED_TRACE(absl::StrFormat(
"Failed at U+%x", ch));