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/fxcrt/fx_bidi.h" 6 #include "testing/gtest/include/gtest/gtest.h" 7 8 namespace { 9 10 const wchar_t kNeutralChar = 32; 11 const wchar_t kLeftChar = 65; 12 const wchar_t kRightChar = 1424; 13 14 } // namespace 15 16 TEST(fxcrt, BidiCharEmpty) { 17 CFX_BidiChar bidi; 18 CFX_BidiChar::Segment info; 19 20 info = bidi.GetSegmentInfo(); 21 EXPECT_EQ(CFX_BidiChar::NEUTRAL, info.direction); 22 EXPECT_EQ(0, info.start); 23 EXPECT_EQ(0, info.count); 24 EXPECT_FALSE(bidi.EndChar()); 25 } 26 27 TEST(fxcrt, BidiCharLeft) { 28 CFX_BidiChar bidi; 29 CFX_BidiChar::Segment info; 30 31 EXPECT_TRUE(bidi.AppendChar(kLeftChar)); 32 info = bidi.GetSegmentInfo(); 33 EXPECT_EQ(0, info.start); 34 EXPECT_EQ(0, info.count); 35 36 EXPECT_FALSE(bidi.AppendChar(kLeftChar)); 37 EXPECT_FALSE(bidi.AppendChar(kLeftChar)); 38 39 info = bidi.GetSegmentInfo(); 40 EXPECT_EQ(CFX_BidiChar::NEUTRAL, info.direction); 41 EXPECT_EQ(0, info.start); 42 EXPECT_EQ(0, info.count); 43 44 EXPECT_TRUE(bidi.EndChar()); 45 info = bidi.GetSegmentInfo(); 46 EXPECT_EQ(CFX_BidiChar::LEFT, info.direction); 47 EXPECT_EQ(0, info.start); 48 EXPECT_EQ(3, info.count); 49 50 EXPECT_FALSE(bidi.EndChar()); 51 } 52 53 TEST(fxcrt, BidiCharLeftNeutralRight) { 54 CFX_BidiChar bidi; 55 CFX_BidiChar::Segment info; 56 57 EXPECT_TRUE(bidi.AppendChar(kLeftChar)); 58 info = bidi.GetSegmentInfo(); 59 EXPECT_EQ(0, info.start); 60 EXPECT_EQ(0, info.count); 61 62 EXPECT_FALSE(bidi.AppendChar(kLeftChar)); 63 EXPECT_FALSE(bidi.AppendChar(kLeftChar)); 64 EXPECT_TRUE(bidi.AppendChar(kNeutralChar)); 65 info = bidi.GetSegmentInfo(); 66 EXPECT_EQ(0, info.start); 67 EXPECT_EQ(3, info.count); 68 69 EXPECT_FALSE(bidi.AppendChar(kNeutralChar)); 70 EXPECT_FALSE(bidi.AppendChar(kNeutralChar)); 71 EXPECT_FALSE(bidi.AppendChar(kNeutralChar)); 72 EXPECT_TRUE(bidi.AppendChar(kRightChar)); 73 info = bidi.GetSegmentInfo(); 74 EXPECT_EQ(CFX_BidiChar::NEUTRAL, info.direction); 75 EXPECT_EQ(3, info.start); 76 EXPECT_EQ(4, info.count); 77 78 EXPECT_TRUE(bidi.EndChar()); 79 info = bidi.GetSegmentInfo(); 80 EXPECT_EQ(CFX_BidiChar::RIGHT, info.direction); 81 EXPECT_EQ(7, info.start); 82 EXPECT_EQ(1, info.count); 83 84 EXPECT_FALSE(bidi.EndChar()); 85 } 86 87 TEST(fxcrt, BidiCharLeftRightLeft) { 88 CFX_BidiChar bidi; 89 CFX_BidiChar::Segment info; 90 91 EXPECT_TRUE(bidi.AppendChar(kLeftChar)); 92 info = bidi.GetSegmentInfo(); 93 EXPECT_EQ(0, info.start); 94 EXPECT_EQ(0, info.count); 95 96 EXPECT_FALSE(bidi.AppendChar(kLeftChar)); 97 EXPECT_FALSE(bidi.AppendChar(kLeftChar)); 98 EXPECT_TRUE(bidi.AppendChar(kRightChar)); 99 info = bidi.GetSegmentInfo(); 100 EXPECT_EQ(0, info.start); 101 EXPECT_EQ(3, info.count); 102 103 EXPECT_FALSE(bidi.AppendChar(kRightChar)); 104 EXPECT_FALSE(bidi.AppendChar(kRightChar)); 105 EXPECT_FALSE(bidi.AppendChar(kRightChar)); 106 EXPECT_TRUE(bidi.AppendChar(kLeftChar)); 107 info = bidi.GetSegmentInfo(); 108 EXPECT_EQ(CFX_BidiChar::RIGHT, info.direction); 109 EXPECT_EQ(3, info.start); 110 EXPECT_EQ(4, info.count); 111 112 EXPECT_TRUE(bidi.EndChar()); 113 info = bidi.GetSegmentInfo(); 114 EXPECT_EQ(CFX_BidiChar::LEFT, info.direction); 115 EXPECT_EQ(7, info.start); 116 EXPECT_EQ(1, info.count); 117 118 EXPECT_FALSE(bidi.EndChar()); 119 } 120 121 TEST(fxcrt, BidiStringEmpty) { 122 CFX_BidiString bidi(L""); 123 EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); 124 EXPECT_TRUE(bidi.begin() == bidi.end()); 125 } 126 127 TEST(fxcrt, BidiStringAllNeutral) { 128 { 129 const wchar_t str[] = {kNeutralChar, 0}; 130 CFX_BidiString bidi(str); 131 EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); 132 133 auto it = bidi.begin(); 134 ASSERT_FALSE(it == bidi.end()); 135 EXPECT_EQ(0, it->start); 136 EXPECT_EQ(1, it->count); 137 EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); 138 ++it; 139 EXPECT_TRUE(it == bidi.end()); 140 } 141 { 142 const wchar_t str[] = {kNeutralChar, kNeutralChar, kNeutralChar, 0}; 143 CFX_BidiString bidi(str); 144 EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); 145 146 auto it = bidi.begin(); 147 ASSERT_FALSE(it == bidi.end()); 148 EXPECT_EQ(0, it->start); 149 EXPECT_EQ(3, it->count); 150 EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); 151 ++it; 152 EXPECT_TRUE(it == bidi.end()); 153 } 154 } 155 156 TEST(fxcrt, BidiStringAllLeft) { 157 { 158 const wchar_t str[] = {kLeftChar, 0}; 159 CFX_BidiString bidi(str); 160 EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); 161 162 auto it = bidi.begin(); 163 ASSERT_FALSE(it == bidi.end()); 164 EXPECT_EQ(0, it->start); 165 EXPECT_EQ(0, it->count); 166 EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); 167 ASSERT_FALSE(it == bidi.end()); 168 169 ++it; 170 EXPECT_EQ(0, it->start); 171 EXPECT_EQ(1, it->count); 172 EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); 173 ASSERT_FALSE(it == bidi.end()); 174 175 ++it; 176 EXPECT_TRUE(it == bidi.end()); 177 } 178 { 179 const wchar_t str[] = {kLeftChar, kLeftChar, kLeftChar, 0}; 180 CFX_BidiString bidi(str); 181 EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); 182 183 auto it = bidi.begin(); 184 ASSERT_FALSE(it == bidi.end()); 185 EXPECT_EQ(0, it->start); 186 EXPECT_EQ(0, it->count); 187 EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); 188 ASSERT_FALSE(it == bidi.end()); 189 190 ++it; 191 EXPECT_EQ(0, it->start); 192 EXPECT_EQ(3, it->count); 193 EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); 194 ASSERT_FALSE(it == bidi.end()); 195 196 ++it; 197 EXPECT_TRUE(it == bidi.end()); 198 } 199 } 200 201 TEST(fxcrt, BidiStringAllRight) { 202 { 203 const wchar_t str[] = {kRightChar, 0}; 204 CFX_BidiString bidi(str); 205 EXPECT_EQ(CFX_BidiChar::RIGHT, bidi.OverallDirection()); 206 207 auto it = bidi.begin(); 208 EXPECT_EQ(0, it->start); 209 EXPECT_EQ(1, it->count); 210 EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); 211 ASSERT_FALSE(it == bidi.end()); 212 213 ++it; 214 ASSERT_FALSE(it == bidi.end()); 215 EXPECT_EQ(0, it->start); 216 EXPECT_EQ(0, it->count); 217 EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); 218 ASSERT_FALSE(it == bidi.end()); 219 220 ++it; 221 EXPECT_TRUE(it == bidi.end()); 222 } 223 { 224 const wchar_t str[] = {kRightChar, kRightChar, kRightChar, 0}; 225 CFX_BidiString bidi(str); 226 EXPECT_EQ(CFX_BidiChar::RIGHT, bidi.OverallDirection()); 227 228 auto it = bidi.begin(); 229 EXPECT_EQ(0, it->start); 230 EXPECT_EQ(3, it->count); 231 EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); 232 ASSERT_FALSE(it == bidi.end()); 233 234 ++it; 235 ASSERT_FALSE(it == bidi.end()); 236 EXPECT_EQ(0, it->start); 237 EXPECT_EQ(0, it->count); 238 EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); 239 ASSERT_FALSE(it == bidi.end()); 240 241 ++it; 242 EXPECT_TRUE(it == bidi.end()); 243 } 244 } 245 246 TEST(fxcrt, BidiStringLeftNeutralLeftRight) { 247 const wchar_t str[] = {kLeftChar, kNeutralChar, kLeftChar, kRightChar, 0}; 248 CFX_BidiString bidi(str); 249 EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); 250 251 auto it = bidi.begin(); 252 ASSERT_FALSE(it == bidi.end()); 253 EXPECT_EQ(0, it->start); 254 EXPECT_EQ(0, it->count); 255 EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); 256 ASSERT_FALSE(it == bidi.end()); 257 258 ++it; 259 EXPECT_EQ(0, it->start); 260 EXPECT_EQ(1, it->count); 261 EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); 262 ASSERT_FALSE(it == bidi.end()); 263 264 ++it; 265 EXPECT_EQ(1, it->start); 266 EXPECT_EQ(1, it->count); 267 EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); 268 ASSERT_FALSE(it == bidi.end()); 269 270 ++it; 271 EXPECT_EQ(2, it->start); 272 EXPECT_EQ(1, it->count); 273 EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); 274 ASSERT_FALSE(it == bidi.end()); 275 276 ++it; 277 EXPECT_EQ(3, it->start); 278 EXPECT_EQ(1, it->count); 279 EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); 280 ASSERT_FALSE(it == bidi.end()); 281 282 ++it; 283 EXPECT_TRUE(it == bidi.end()); 284 } 285 286 TEST(fxcrt, BidiStringRightNeutralLeftRight) { 287 const wchar_t str[] = {kRightChar, kNeutralChar, kLeftChar, kRightChar, 0}; 288 CFX_BidiString bidi(str); 289 EXPECT_EQ(CFX_BidiChar::RIGHT, bidi.OverallDirection()); 290 291 auto it = bidi.begin(); 292 EXPECT_EQ(3, it->start); 293 EXPECT_EQ(1, it->count); 294 EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); 295 ASSERT_FALSE(it == bidi.end()); 296 297 ++it; 298 EXPECT_EQ(2, it->start); 299 EXPECT_EQ(1, it->count); 300 EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); 301 ASSERT_FALSE(it == bidi.end()); 302 303 ++it; 304 EXPECT_EQ(1, it->start); 305 EXPECT_EQ(1, it->count); 306 EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); 307 ASSERT_FALSE(it == bidi.end()); 308 309 ++it; 310 EXPECT_EQ(0, it->start); 311 EXPECT_EQ(1, it->count); 312 EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); 313 ASSERT_FALSE(it == bidi.end()); 314 315 ++it; 316 ASSERT_FALSE(it == bidi.end()); 317 EXPECT_EQ(0, it->start); 318 EXPECT_EQ(0, it->count); 319 EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); 320 ASSERT_FALSE(it == bidi.end()); 321 322 ++it; 323 EXPECT_TRUE(it == bidi.end()); 324 } 325 326 TEST(fxcrt, BidiStringReverse) { 327 const wchar_t str[] = {kLeftChar, kNeutralChar, kRightChar, kLeftChar, 0}; 328 CFX_BidiString bidi(str); 329 EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); 330 bidi.SetOverallDirectionRight(); 331 332 auto it = bidi.begin(); 333 ASSERT_FALSE(it == bidi.end()); 334 EXPECT_EQ(3, it->start); 335 EXPECT_EQ(1, it->count); 336 EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); 337 338 ++it; 339 ASSERT_FALSE(it == bidi.end()); 340 EXPECT_EQ(2, it->start); 341 EXPECT_EQ(1, it->count); 342 EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); 343 ASSERT_FALSE(it == bidi.end()); 344 345 ++it; 346 ASSERT_FALSE(it == bidi.end()); 347 EXPECT_EQ(1, it->start); 348 EXPECT_EQ(1, it->count); 349 EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); 350 351 ++it; 352 ASSERT_FALSE(it == bidi.end()); 353 EXPECT_EQ(0, it->start); 354 EXPECT_EQ(1, it->count); 355 EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); 356 357 ++it; 358 ASSERT_FALSE(it == bidi.end()); 359 EXPECT_EQ(0, it->start); 360 EXPECT_EQ(0, it->count); 361 EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); 362 363 ++it; 364 EXPECT_TRUE(it == bidi.end()); 365 } 366