summaryrefslogtreecommitdiff
path: root/test/text/bidi.test.cpp
blob: 7c0eb8288458225f0ea7cce93742c0f81cf637f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

#include <mbgl/test/util.hpp>

#include <mbgl/text/bidi.hpp>

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<std::u16string>{ u"۳۹ﻡﻼﺳ" });
}

TEST(BiDi, ReverseMixed) {
    BiDi bidi;
    EXPECT_EQ(bidi.processText(applyArabicShaping(u"مكتبة الإسكندرية‎‎ Maktabat al-Iskandarīyah"), {}),
              std::vector<std::u16string>{ u" Maktabat al-Iskandarīyahﺔﻳﺭﺪﻨﻜﺳﻹﺍ ﺔﺒﺘﻜﻣ" });
}

TEST(BiDi, WithLineBreaks) {
    BiDi bidi;
    std::vector<std::u16string> 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<StyledText> expected;
    StyledText input(
        applyArabicShaping(u"مكتبة الإسكندرية‎‎ Maktabat al-Iskandarīyah"),
        std::vector<uint8_t>{ 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<uint8_t>{ 0,0,0,0,0 }
    ));
    EXPECT_EQ(expected.rbegin()->first.size(), expected.rbegin()->second.size());
    expected.emplace_back(StyledText(
        u" ‎‎ﺔﻳﺭﺪﻨﻜﺳﻹﺍ ",
        std::vector<uint8_t>{ 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<uint8_t>{ 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<uint8_t>{ 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);
}