| // Copyright 2015 PDFium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "core/fxcrt/fx_bidi.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace { |
| |
| const wchar_t kNeutralChar = 32; |
| const wchar_t kLeftChar = 65; |
| const wchar_t kRightChar = 1424; |
| |
| } // namespace |
| |
| TEST(fxcrt, BidiCharEmpty) { |
| CFX_BidiChar bidi; |
| CFX_BidiChar::Segment info; |
| |
| info = bidi.GetSegmentInfo(); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, info.direction); |
| EXPECT_EQ(0, info.start); |
| EXPECT_EQ(0, info.count); |
| EXPECT_FALSE(bidi.EndChar()); |
| } |
| |
| TEST(fxcrt, BidiCharLeft) { |
| CFX_BidiChar bidi; |
| CFX_BidiChar::Segment info; |
| |
| EXPECT_TRUE(bidi.AppendChar(kLeftChar)); |
| info = bidi.GetSegmentInfo(); |
| EXPECT_EQ(0, info.start); |
| EXPECT_EQ(0, info.count); |
| |
| EXPECT_FALSE(bidi.AppendChar(kLeftChar)); |
| EXPECT_FALSE(bidi.AppendChar(kLeftChar)); |
| |
| info = bidi.GetSegmentInfo(); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, info.direction); |
| EXPECT_EQ(0, info.start); |
| EXPECT_EQ(0, info.count); |
| |
| EXPECT_TRUE(bidi.EndChar()); |
| info = bidi.GetSegmentInfo(); |
| EXPECT_EQ(CFX_BidiChar::LEFT, info.direction); |
| EXPECT_EQ(0, info.start); |
| EXPECT_EQ(3, info.count); |
| |
| EXPECT_FALSE(bidi.EndChar()); |
| } |
| |
| TEST(fxcrt, BidiCharLeftNeutralRight) { |
| CFX_BidiChar bidi; |
| CFX_BidiChar::Segment info; |
| |
| EXPECT_TRUE(bidi.AppendChar(kLeftChar)); |
| info = bidi.GetSegmentInfo(); |
| EXPECT_EQ(0, info.start); |
| EXPECT_EQ(0, info.count); |
| |
| EXPECT_FALSE(bidi.AppendChar(kLeftChar)); |
| EXPECT_FALSE(bidi.AppendChar(kLeftChar)); |
| EXPECT_TRUE(bidi.AppendChar(kNeutralChar)); |
| info = bidi.GetSegmentInfo(); |
| EXPECT_EQ(0, info.start); |
| EXPECT_EQ(3, info.count); |
| |
| EXPECT_FALSE(bidi.AppendChar(kNeutralChar)); |
| EXPECT_FALSE(bidi.AppendChar(kNeutralChar)); |
| EXPECT_FALSE(bidi.AppendChar(kNeutralChar)); |
| EXPECT_TRUE(bidi.AppendChar(kRightChar)); |
| info = bidi.GetSegmentInfo(); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, info.direction); |
| EXPECT_EQ(3, info.start); |
| EXPECT_EQ(4, info.count); |
| |
| EXPECT_TRUE(bidi.EndChar()); |
| info = bidi.GetSegmentInfo(); |
| EXPECT_EQ(CFX_BidiChar::RIGHT, info.direction); |
| EXPECT_EQ(7, info.start); |
| EXPECT_EQ(1, info.count); |
| |
| EXPECT_FALSE(bidi.EndChar()); |
| } |
| |
| TEST(fxcrt, BidiCharLeftRightLeft) { |
| CFX_BidiChar bidi; |
| CFX_BidiChar::Segment info; |
| |
| EXPECT_TRUE(bidi.AppendChar(kLeftChar)); |
| info = bidi.GetSegmentInfo(); |
| EXPECT_EQ(0, info.start); |
| EXPECT_EQ(0, info.count); |
| |
| EXPECT_FALSE(bidi.AppendChar(kLeftChar)); |
| EXPECT_FALSE(bidi.AppendChar(kLeftChar)); |
| EXPECT_TRUE(bidi.AppendChar(kRightChar)); |
| info = bidi.GetSegmentInfo(); |
| EXPECT_EQ(0, info.start); |
| EXPECT_EQ(3, info.count); |
| |
| EXPECT_FALSE(bidi.AppendChar(kRightChar)); |
| EXPECT_FALSE(bidi.AppendChar(kRightChar)); |
| EXPECT_FALSE(bidi.AppendChar(kRightChar)); |
| EXPECT_TRUE(bidi.AppendChar(kLeftChar)); |
| info = bidi.GetSegmentInfo(); |
| EXPECT_EQ(CFX_BidiChar::RIGHT, info.direction); |
| EXPECT_EQ(3, info.start); |
| EXPECT_EQ(4, info.count); |
| |
| EXPECT_TRUE(bidi.EndChar()); |
| info = bidi.GetSegmentInfo(); |
| EXPECT_EQ(CFX_BidiChar::LEFT, info.direction); |
| EXPECT_EQ(7, info.start); |
| EXPECT_EQ(1, info.count); |
| |
| EXPECT_FALSE(bidi.EndChar()); |
| } |
| |
| TEST(fxcrt, BidiStringEmpty) { |
| CFX_BidiString bidi(L""); |
| EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); |
| EXPECT_TRUE(bidi.begin() == bidi.end()); |
| } |
| |
| TEST(fxcrt, BidiStringAllNeutral) { |
| { |
| const wchar_t str[] = {kNeutralChar, 0}; |
| CFX_BidiString bidi(str); |
| EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); |
| |
| auto it = bidi.begin(); |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); |
| ++it; |
| EXPECT_TRUE(it == bidi.end()); |
| } |
| { |
| const wchar_t str[] = {kNeutralChar, kNeutralChar, kNeutralChar, 0}; |
| CFX_BidiString bidi(str); |
| EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); |
| |
| auto it = bidi.begin(); |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(3, it->count); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); |
| ++it; |
| EXPECT_TRUE(it == bidi.end()); |
| } |
| } |
| |
| TEST(fxcrt, BidiStringAllLeft) { |
| { |
| const wchar_t str[] = {kLeftChar, 0}; |
| CFX_BidiString bidi(str); |
| EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); |
| |
| auto it = bidi.begin(); |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(0, it->count); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_TRUE(it == bidi.end()); |
| } |
| { |
| const wchar_t str[] = {kLeftChar, kLeftChar, kLeftChar, 0}; |
| CFX_BidiString bidi(str); |
| EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); |
| |
| auto it = bidi.begin(); |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(0, it->count); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(3, it->count); |
| EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_TRUE(it == bidi.end()); |
| } |
| } |
| |
| TEST(fxcrt, BidiStringAllRight) { |
| { |
| const wchar_t str[] = {kRightChar, 0}; |
| CFX_BidiString bidi(str); |
| EXPECT_EQ(CFX_BidiChar::RIGHT, bidi.OverallDirection()); |
| |
| auto it = bidi.begin(); |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(0, it->count); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_TRUE(it == bidi.end()); |
| } |
| { |
| const wchar_t str[] = {kRightChar, kRightChar, kRightChar, 0}; |
| CFX_BidiString bidi(str); |
| EXPECT_EQ(CFX_BidiChar::RIGHT, bidi.OverallDirection()); |
| |
| auto it = bidi.begin(); |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(3, it->count); |
| EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(0, it->count); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_TRUE(it == bidi.end()); |
| } |
| } |
| |
| TEST(fxcrt, BidiStringLeftNeutralLeftRight) { |
| const wchar_t str[] = {kLeftChar, kNeutralChar, kLeftChar, kRightChar, 0}; |
| CFX_BidiString bidi(str); |
| EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); |
| |
| auto it = bidi.begin(); |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(0, it->count); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_EQ(1, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_EQ(2, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_EQ(3, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_TRUE(it == bidi.end()); |
| } |
| |
| TEST(fxcrt, BidiStringRightNeutralLeftRight) { |
| const wchar_t str[] = {kRightChar, kNeutralChar, kLeftChar, kRightChar, 0}; |
| CFX_BidiString bidi(str); |
| EXPECT_EQ(CFX_BidiChar::RIGHT, bidi.OverallDirection()); |
| |
| auto it = bidi.begin(); |
| EXPECT_EQ(3, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_EQ(2, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_EQ(1, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(0, it->count); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| EXPECT_TRUE(it == bidi.end()); |
| } |
| |
| TEST(fxcrt, BidiStringReverse) { |
| const wchar_t str[] = {kLeftChar, kNeutralChar, kRightChar, kLeftChar, 0}; |
| CFX_BidiString bidi(str); |
| EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); |
| bidi.SetOverallDirectionRight(); |
| |
| auto it = bidi.begin(); |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(3, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); |
| |
| ++it; |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(2, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); |
| ASSERT_FALSE(it == bidi.end()); |
| |
| ++it; |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(1, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); |
| |
| ++it; |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(1, it->count); |
| EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); |
| |
| ++it; |
| ASSERT_FALSE(it == bidi.end()); |
| EXPECT_EQ(0, it->start); |
| EXPECT_EQ(0, it->count); |
| EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); |
| |
| ++it; |
| EXPECT_TRUE(it == bidi.end()); |
| } |