Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1061)

Unified Diff: third_party/WebKit/Source/core/editing/state_machines/BackwardGraphemeBoundaryStateMachineTest.cpp

Issue 1833413002: [All-in-one patch] Implement own grapheme boundary breaker for editing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Upload All-in-one patch Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/editing/state_machines/BackwardGraphemeBoundaryStateMachineTest.cpp
diff --git a/third_party/WebKit/Source/core/editing/state_machines/BackwardGraphemeBoundaryStateMachineTest.cpp b/third_party/WebKit/Source/core/editing/state_machines/BackwardGraphemeBoundaryStateMachineTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c5f029a22e13448a3d7e8ff75d8235b8157d6fe5
--- /dev/null
+++ b/third_party/WebKit/Source/core/editing/state_machines/BackwardGraphemeBoundaryStateMachineTest.cpp
@@ -0,0 +1,723 @@
+// Copyright 2016 The Chromium 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/editing/state_machines/BackwardGraphemeBoundaryStateMachine.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+
+namespace {
+const TextSegmentationMachineState kNeedMoreCodeUnit
+ = TextSegmentationMachineState::NeedMoreCodeUnit;
+const TextSegmentationMachineState kFinished
+ = TextSegmentationMachineState::Finished;
+} // namespace
+
+// Notations:
+// | indicates inidicates initial offset position.
+// SOT indicates start of text.
+// [Lead] indicates broken lonely lead surrogate.
+// [Trail] indicates broken lonely trail surrogate.
+// [U] indicates regional indicator symbol U.
+// [S] indicates regional indicator symbol S.
+
+TEST(BackwardGraphemeBoundaryStatemachineTest, DoNothingCase)
+{
+ BackwardGraphemeBoundaryStateMachine machine;
+
+ EXPECT_EQ(0, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(0, machine.finalizeAndGetBoundaryOffset());
+}
+
+TEST(BackwardGraphemeBoundaryStatemachineTest, BrokenSurrogatePair)
+{
+ BackwardGraphemeBoundaryStateMachine machine;
+
+ // U+1F5FA(WORLD MAP) is \uD83D\uDDFA in UTF-16.
+ const UChar lead = 0xD83D;
+ const UChar trail = 0xDDFA;
+
+ // [Lead]
+ machine.reset();
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(lead));
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [Trail]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(trail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+
+ // [Trail] + [Trail]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(trail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(trail));
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [Trail]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(trail));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+}
+
+TEST(BackwardGraphemeBoundaryStatemachineTest, BreakImmediately)
+{
+ BackwardGraphemeBoundaryStateMachine machine;
+
+ // U+1F466 (BOY) is \uD83D\uDC66 in UTF16.
+ const UChar kBoyLead = 0xD83D;
+ const UChar kBoyTrail = 0xDC66;
+
+ // 'a' + 'a'
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + 'a'
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+
+ // U+1F466 + 'a'
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kBoyLead));
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + U+1F466
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyLead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // U+1F466 + U+1F466
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kBoyLead));
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + U+1F466
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyLead));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // Broken surrogates.
+ // [Lead] + 'a'
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kBoyLead));
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [Trail] + 'a'
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+
+ // [Trail] + [Trail] + 'a'
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [Trail] + 'a'
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
+
+ // [Lead] + U+1F466
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyLead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kBoyLead));
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [Trail] + U+1F466
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // [Trail] + [Trail] + U+1F466
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [Trail] + U+1F466
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kBoyTrail));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+}
+
+TEST(BackwardGraphemeBoundaryStatemachineTest, NotBreakImmediatelyBefore)
+{
+ BackwardGraphemeBoundaryStateMachine machine;
+
+ // There is no grapheme boundary after CR and before LF.
+ // 'a' + CR + LF
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit('\n'));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit('\r'));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + CR + LF
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit('\n'));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit('\r'));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // Surrogate Pairs
+ // U+E0100 (VARIATION SELECTOR 17) and U+FE0F (VARIATION SELECTOR 16) have a
+ // Extend grapheme property. There is no grapheme boundary before this code
+ // points.
+ const UChar kVS16 = 0xFE0F;
+ const UChar kVS17Lead = 0xDB40;
+ const UChar kVS17Trail = 0xDD00;
+ // 'a' + U+3402 + U+E0100
+ // U+3402 U+E0100 is a valid variation sequence.
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0x3402));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // U+E0100 + U+3402 + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0x3402));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + U+3402 + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0x3402));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // [Lead] + U+3402 + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0x3402));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // [Trail] + [Trail] + U+3402 + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0x3402));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [Trail] + U+3402 + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0x3402));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [Trail] + U+3402 + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0x3402));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // U+1F441 (EYE) is \uD83D\uDC41 in UTF16.
+ const UChar kEyeLead = 0xD83D;
+ const UChar kEyeTrail = 0xDC41;
+ // U+1F441 U+FE0F is a valid variation sequence.
+ // 'a' + U+1F441 + U+FE0F
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS16));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeLead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // U+1F441 + U+1F441 + U+FE0F
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS16));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kEyeLead));
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + U+1F441 + U+FE0F
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS16));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeLead));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // [Lead] + U+1F441 + U+FE0F
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS16));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeLead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kEyeLead));
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [Lead] + U+1F441 + U+FE0F
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS16));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // [Trail] + [Lead] + U+1F441 + U+FE0F
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS16));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kEyeTrail));
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [Lead] + U+1F441 + U+FE0F
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS16));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kEyeTrail));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
+
+ // U+2000B is \uD840\uDC0B in UTF16.
+ const UChar kHanLead = 0xD840;
+ const UChar kHanTrail = 0xDC0B;
+ // U+2000B U+E0100 is a valid variation sequence.
+ // 'a' + U+2000B + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanLead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // U+E0100 + U+2000B + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + U+2000B + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanLead));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // [Lead] + U+2000B + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanLead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [Trail] + U+2000B + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // [Trail] + [Trail] + U+2000B + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [Trail] + U+2000B + U+E0100
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Lead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kHanLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kVS17Trail));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // Much longer case.
+ // U+1F469 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F468 is a valid
+ // ZWJ emoji sequence. Following sequence is corresponding to this ZWJ emoji
+ // sequence.
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0xDC68));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0xD83D));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0x200D));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0xDC8B));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0xD83D));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0x200D));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0xFE0F));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0x2764));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0x200D));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0xDC69));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(0xD83D));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
+}
+
+TEST(BackwardGraphemeBoundaryStatemachineTest, Flags)
+{
+ BackwardGraphemeBoundaryStateMachine machine;
+
+ // U+1F1FA (REGIONAL INDICATOR SYMBOL LETTER U) is \uD83C\uDDFA in UTF16.
+ // U+1F1F8 (REGIONAL INDICATOR SYMBOL LETTER S) is \uD83C\uDDF8 in UTF16.
+ const UChar kRisULead = 0xD83C;
+ const UChar kRisUTrail = 0xDDFA;
+ const UChar kRisSLead = 0xD83C;
+ const UChar kRisSTrail = 0xDDF8;
+
+ // 'a' + [U] + [S]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [U] + [S]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // [Lead] + [U] + [S]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [Trail] + [U] + [S]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [Trail] + [U] + [S]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [U] + [S] + [U] + [S]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [U] + [S] + [U] + [S]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // [Lead] + [U] + [S] + [U] + [S]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [Trail] + [U] + [S] + [U] + [S]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [Trail] + [U] + [S] + [U] + [S]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [U]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [U]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // [Lead] + [U]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [Trail] + [U]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [Trail] + [U]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [U] + [S] + [U]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [U] + [S] + [U]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // [Lead] + [U] + [S] + [U]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // 'a' + [Trail] + [U] + [S] + [U]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kFinished, machine.feedPrecedingCodeUnit('a'));
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // SOT + [Trail] + [U] + [S] + [U]
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+
+ // Much longer case.
+ machine.reset();
+ for (int i = 0; i < 1024; ++i) {
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ }
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
+
+ machine.reset();
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ for (int i = 0; i < 1024; ++i) {
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisUTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisULead));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSTrail));
+ EXPECT_EQ(kNeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kRisSLead));
+ }
+ EXPECT_EQ(kFinished, machine.tellEndOfPrecedingText());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+ EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
+}
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698