1 // Copyright 2015 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "core/include/fxcrt/fx_bidi.h"
6 #include "testing/gtest/include/gtest/gtest.h"
7 
8 namespace {
9 
10 const FX_WCHAR kNeutralChar = 32;
11 const FX_WCHAR kLeftChar = 65;
12 const FX_WCHAR kRightChar = 1424;
13 
14 }  // namespace
15 
TEST(fxcrt,BidiCharEmpty)16 TEST(fxcrt, BidiCharEmpty) {
17   int32_t start = -1;
18   int32_t count = -1;
19   CFX_BidiChar bidi;
20   CFX_BidiChar::Direction dir = bidi.GetBidiInfo(nullptr, nullptr);
21   EXPECT_EQ(CFX_BidiChar::NEUTRAL, dir);
22 
23   dir = bidi.GetBidiInfo(&start, nullptr);
24   EXPECT_EQ(CFX_BidiChar::NEUTRAL, dir);
25   EXPECT_EQ(0, start);
26 
27   dir = bidi.GetBidiInfo(nullptr, &count);
28   EXPECT_EQ(CFX_BidiChar::NEUTRAL, dir);
29   EXPECT_EQ(0, count);
30 
31   start = -1;
32   count = -1;
33   dir = bidi.GetBidiInfo(&start, &count);
34   EXPECT_EQ(CFX_BidiChar::NEUTRAL, dir);
35   EXPECT_EQ(0, start);
36   EXPECT_EQ(0, count);
37 
38   EXPECT_FALSE(bidi.EndChar());
39 }
40 
TEST(fxcrt,BidiCharLeft)41 TEST(fxcrt, BidiCharLeft) {
42   int32_t start = -1;
43   int32_t count = -1;
44   CFX_BidiChar bidi;
45 
46   EXPECT_TRUE(bidi.AppendChar(kLeftChar));
47   CFX_BidiChar::Direction dir = bidi.GetBidiInfo(&start, &count);
48   EXPECT_EQ(0, start);
49   EXPECT_EQ(0, count);
50 
51   EXPECT_FALSE(bidi.AppendChar(kLeftChar));
52   EXPECT_FALSE(bidi.AppendChar(kLeftChar));
53 
54   dir = bidi.GetBidiInfo(&start, &count);
55   EXPECT_EQ(CFX_BidiChar::NEUTRAL, dir);
56   EXPECT_EQ(0, start);
57   EXPECT_EQ(0, count);
58 
59   EXPECT_TRUE(bidi.EndChar());
60   dir = bidi.GetBidiInfo(&start, &count);
61   EXPECT_EQ(CFX_BidiChar::LEFT, dir);
62   EXPECT_EQ(0, start);
63   EXPECT_EQ(3, count);
64 
65   EXPECT_FALSE(bidi.EndChar());
66 }
67 
TEST(fxcrt,BidiCharLeftNeutralRight)68 TEST(fxcrt, BidiCharLeftNeutralRight) {
69   int32_t start = -1;
70   int32_t count = -1;
71   CFX_BidiChar bidi;
72 
73   EXPECT_TRUE(bidi.AppendChar(kLeftChar));
74   CFX_BidiChar::Direction dir = bidi.GetBidiInfo(&start, &count);
75   EXPECT_EQ(0, start);
76   EXPECT_EQ(0, count);
77 
78   EXPECT_FALSE(bidi.AppendChar(kLeftChar));
79   EXPECT_FALSE(bidi.AppendChar(kLeftChar));
80   EXPECT_TRUE(bidi.AppendChar(kNeutralChar));
81   dir = bidi.GetBidiInfo(&start, &count);
82   EXPECT_EQ(0, start);
83   EXPECT_EQ(3, count);
84 
85   EXPECT_FALSE(bidi.AppendChar(kNeutralChar));
86   EXPECT_FALSE(bidi.AppendChar(kNeutralChar));
87   EXPECT_FALSE(bidi.AppendChar(kNeutralChar));
88   EXPECT_TRUE(bidi.AppendChar(kRightChar));
89   dir = bidi.GetBidiInfo(&start, &count);
90   EXPECT_EQ(CFX_BidiChar::NEUTRAL, dir);
91   EXPECT_EQ(3, start);
92   EXPECT_EQ(4, count);
93 
94   EXPECT_TRUE(bidi.EndChar());
95   dir = bidi.GetBidiInfo(&start, &count);
96   EXPECT_EQ(CFX_BidiChar::RIGHT, dir);
97   EXPECT_EQ(7, start);
98   EXPECT_EQ(1, count);
99 
100   EXPECT_FALSE(bidi.EndChar());
101 }
102 
TEST(fxcrt,BidiCharLeftRightLeft)103 TEST(fxcrt, BidiCharLeftRightLeft) {
104   int32_t start = -1;
105   int32_t count = -1;
106   CFX_BidiChar bidi;
107 
108   EXPECT_TRUE(bidi.AppendChar(kLeftChar));
109   CFX_BidiChar::Direction dir = bidi.GetBidiInfo(&start, &count);
110   EXPECT_EQ(0, start);
111   EXPECT_EQ(0, count);
112 
113   EXPECT_FALSE(bidi.AppendChar(kLeftChar));
114   EXPECT_FALSE(bidi.AppendChar(kLeftChar));
115   EXPECT_TRUE(bidi.AppendChar(kRightChar));
116   dir = bidi.GetBidiInfo(&start, &count);
117   EXPECT_EQ(0, start);
118   EXPECT_EQ(3, count);
119 
120   EXPECT_FALSE(bidi.AppendChar(kRightChar));
121   EXPECT_FALSE(bidi.AppendChar(kRightChar));
122   EXPECT_FALSE(bidi.AppendChar(kRightChar));
123   EXPECT_TRUE(bidi.AppendChar(kLeftChar));
124   dir = bidi.GetBidiInfo(&start, &count);
125   EXPECT_EQ(CFX_BidiChar::RIGHT, dir);
126   EXPECT_EQ(3, start);
127   EXPECT_EQ(4, count);
128 
129   EXPECT_TRUE(bidi.EndChar());
130   dir = bidi.GetBidiInfo(&start, &count);
131   EXPECT_EQ(CFX_BidiChar::LEFT, dir);
132   EXPECT_EQ(7, start);
133   EXPECT_EQ(1, count);
134 
135   EXPECT_FALSE(bidi.EndChar());
136 }
137