#include #include using namespace mbgl; /* These tests mirror the unit tests in mapbox-gl-rtl-text's arabic.test.js The arabic text in results may appear to be backwards This is because whatever you're viewing the text with is applying the bidirectional algorithm a second time. Although they may look the same as input in your viewer, the characters in the test results are "presentation forms" of the characters. To closely inspect the inputs and outputs, use a binary/hex editor. */ TEST(BiDi, ArabicShaping) { EXPECT_EQ(applyArabicShaping(u"اليَمَن‎‎"), u"ﺍﻟﻴﹷﻤﹷﻦ‎‎"); } TEST(BiDi, Tashkeel) { EXPECT_EQ(applyArabicShaping(u"سلام۳۹"), u"ﺳﻼﻡ۳۹"); } TEST(BiDi, MixedShaping) { EXPECT_EQ(applyArabicShaping(u"مكتبة الإسكندرية‎‎ Maktabat al-Iskandarīyah"), u"ﻣﻜﺘﺒﺔ ﺍﻹﺳﻜﻨﺪﺭﻳﺔ‎‎ Maktabat al-Iskandarīyah"); } TEST(BiDi, ReverseArabic) { BiDi bidi; EXPECT_EQ(bidi.processText(applyArabicShaping(u"سلام۳۹"), {}), std::vector{ u"۳۹ﻡﻼﺳ" }); } TEST(BiDi, ReverseMixed) { BiDi bidi; EXPECT_EQ(bidi.processText(applyArabicShaping(u"مكتبة الإسكندرية‎‎ Maktabat al-Iskandarīyah"), {}), std::vector{ u" Maktabat al-Iskandarīyahﺔﻳﺭﺪﻨﻜﺳﻹﺍ ﺔﺒﺘﻜﻣ" }); } TEST(BiDi, WithLineBreaks) { BiDi bidi; std::vector expected; expected.emplace_back(u" ﺔﻳﺭﺪﻨﻜﺳﻹﺍ ﺔﺒﺘﻜﻣ"); expected.emplace_back(u"Maktabat al-"); expected.emplace_back(u"Iskandarīyah"); EXPECT_EQ(bidi.processText(applyArabicShaping(u"مكتبة الإسكندرية‎‎ Maktabat al-Iskandarīyah"), { 18, 30 }), expected); } TEST(BiDi, StyledText) { // This test uses line breaks that intentionally split/reorder/interleave styled blocks // that are contiguous in the input BiDi bidi; std::vector expected; StyledText input( applyArabicShaping(u"مكتبة الإسكندرية‎‎ Maktabat al-Iskandarīyah"), std::vector{ 0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,4,5,5,5,5,6,6,6,6,6,6,6,6,6,6,7,7,7 } ); expected.emplace_back(StyledText( u"ﺔﺒﺘﻜﻣ", std::vector{ 0,0,0,0,0 } )); EXPECT_EQ(expected.rbegin()->first.size(), expected.rbegin()->second.size()); expected.emplace_back(StyledText( u" ‎‎ﺔﻳﺭﺪﻨﻜﺳﻹﺍ ", std::vector{ 2,2,2,2,2,2,2,1,1,1,1,1,1 } )); EXPECT_EQ(expected.rbegin()->first.size(), expected.rbegin()->second.size()); expected.emplace_back(StyledText( u"Maktabat al-", std::vector{ 2,3,3,3,3,3,4,5,5,5,5,6 } )); EXPECT_EQ(expected.rbegin()->first.size(), expected.rbegin()->second.size()); expected.emplace_back(StyledText( u"Iskandarīyah", std::vector{ 6,6,6,6,6,6,6,6,6,7,7,7 } )); EXPECT_EQ(expected.rbegin()->first.size(), expected.rbegin()->second.size()); EXPECT_EQ(bidi.processStyledText(input, { 5, 18, 30 }), expected); }