14e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka/*
24e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka * Copyright (C) 2015 The Android Open Source Project
34e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka *
44e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License");
54e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka * you may not use this file except in compliance with the License.
64e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka * You may obtain a copy of the License at
74e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka *
84e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka *      http://www.apache.org/licenses/LICENSE-2.0
94e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka *
104e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka * Unless required by applicable law or agreed to in writing, software
114e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS,
124e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka * See the License for the specific language governing permissions and
144e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka * limitations under the License.
154e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka */
164e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
174e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka#include <gtest/gtest.h>
184e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka#include <UnicodeUtils.h>
194e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
204e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka#include "LayoutUtils.h"
214e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2214e2d136aaef271ba131f917cf5f27baa31ae5adSeigo Nonakanamespace minikin {
234e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
244e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonakavoid ExpectNextWordBreakForCache(size_t offset_in, const char* query_str) {
254e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    const size_t BUF_SIZE = 256U;
264e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    uint16_t buf[BUF_SIZE];
274e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    size_t expected_breakpoint = 0U;
284e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    size_t size = 0U;
294e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
304e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ParseUnicode(buf, BUF_SIZE, query_str, &size, &expected_breakpoint);
314e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    EXPECT_EQ(expected_breakpoint,
324e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka              getNextWordBreakForCache(buf, offset_in, size))
334e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka        << "Expected position is [" << query_str << "] from offset " << offset_in;
344e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka}
354e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
364e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonakavoid ExpectPrevWordBreakForCache(size_t offset_in, const char* query_str) {
374e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    const size_t BUF_SIZE = 256U;
384e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    uint16_t buf[BUF_SIZE];
394e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    size_t expected_breakpoint = 0U;
404e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    size_t size = 0U;
414e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
424e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ParseUnicode(buf, BUF_SIZE, query_str, &size, &expected_breakpoint);
434e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    EXPECT_EQ(expected_breakpoint,
444e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka              getPrevWordBreakForCache(buf, offset_in, size))
454e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka        << "Expected position is [" << query_str << "] from offset " << offset_in;
464e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka}
474e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
484e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo NonakaTEST(WordBreakTest, goNextWordBreakTest) {
494e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "|");
504e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
514e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Continue for spaces.
524e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "'a' 'b' 'c' 'd' |");
534e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "'a' 'b' 'c' 'd' |");
544e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "'a' 'b' 'c' 'd' |");
554e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "'a' 'b' 'c' 'd' |");
564e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "'a' 'b' 'c' 'd' |");
574e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "'a' 'b' 'c' 'd' |");
584e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
594e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Space makes word break.
604e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "'a' 'b' | U+0020 'c' 'd'");
614e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "'a' 'b' | U+0020 'c' 'd'");
624e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "'a' 'b' U+0020 | 'c' 'd'");
634e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "'a' 'b' U+0020 'c' 'd' |");
644e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "'a' 'b' U+0020 'c' 'd' |");
654e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(5, "'a' 'b' U+0020 'c' 'd' |");
664e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "'a' 'b' U+0020 'c' 'd' |");
674e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
684e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "'a' 'b' | U+2000 'c' 'd'");
694e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "'a' 'b' | U+2000 'c' 'd'");
704e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "'a' 'b' U+2000 | 'c' 'd'");
714e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "'a' 'b' U+2000 'c' 'd' |");
724e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "'a' 'b' U+2000 'c' 'd' |");
734e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(5, "'a' 'b' U+2000 'c' 'd' |");
744e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "'a' 'b' U+2000 'c' 'd' |");
754e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
764e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "'a' 'b' | U+2000 U+2000 'c' 'd'");
774e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "'a' 'b' | U+2000 U+2000 'c' 'd'");
784e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "'a' 'b' U+2000 | U+2000 'c' 'd'");
794e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "'a' 'b' U+2000 U+2000 | 'c' 'd'");
804e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "'a' 'b' U+2000 U+2000 'c' 'd' |");
814e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(5, "'a' 'b' U+2000 U+2000 'c' 'd' |");
824e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(6, "'a' 'b' U+2000 U+2000 'c' 'd' |");
834e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "'a' 'b' U+2000 U+2000 'c' 'd' |");
844e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
854e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK ideographs makes word break.
864e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+4E00 | U+4E00   U+4E00   U+4E00   U+4E00");
874e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+4E00   U+4E00 | U+4E00   U+4E00   U+4E00");
884e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+4E00   U+4E00   U+4E00 | U+4E00   U+4E00");
894e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+4E00   U+4E00   U+4E00   U+4E00 | U+4E00");
904e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+4E00   U+4E00   U+4E00   U+4E00   U+4E00 |");
914e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(5, "U+4E00   U+4E00   U+4E00   U+4E00   U+4E00 |");
924e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000,
934e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka                             "U+4E00   U+4E00   U+4E00   U+4E00   U+4E00 |");
944e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
954e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+4E00 | U+4E8C   U+4E09   U+56DB   U+4E94");
964e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+4E00   U+4E8C | U+4E09   U+56DB   U+4E94");
974e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+4E00   U+4E8C   U+4E09 | U+56DB   U+4E94");
984e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+4E00   U+4E8C   U+4E09   U+56DB | U+4E94");
994e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+4E00   U+4E8C   U+4E09   U+56DB   U+4E94 |");
1004e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(5, "U+4E00   U+4E8C   U+4E09   U+56DB   U+4E94 |");
1014e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000,
1024e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka                             "U+4E00   U+4E8C   U+4E09   U+56DB   U+4E94 |");
1034e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1044e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+4E00 'a' 'b' | U+2000 'c' U+4E00");
1054e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+4E00 'a' 'b' | U+2000 'c' U+4E00");
1064e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+4E00 'a' 'b' | U+2000 'c' U+4E00");
1074e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+4E00 'a' 'b' U+2000 | 'c' U+4E00");
1084e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+4E00 'a' 'b' U+2000 'c' | U+4E00");
1094e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(5, "U+4E00 'a' 'b' U+2000 'c' U+4E00 |");
1104e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+4E00 'a' 'b' U+2000 'c' U+4E00 |");
1114e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1124e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Continue if trailing characters is Unicode combining characters.
1134e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+4E00 U+0332 | U+4E00");
1144e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+4E00 U+0332 | U+4E00");
1154e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+4E00 U+0332 U+4E00 |");
1164e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+4E00 U+0332 U+4E00 |");
1174e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+4E00 U+0332 U+4E00 |");
1184e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1194e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Surrogate pairs.
1204e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+1F60D U+1F618 |");
1214e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+1F60D U+1F618 |");
1224e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+1F60D U+1F618 |");
1234e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+1F60D U+1F618 |");
1244e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+1F60D U+1F618 |");
1254e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+1F60D U+1F618 |");
1264e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1274e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Broken surrogate pairs.
1284e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // U+D84D is leading surrogate but there is no trailing surrogate for it.
1294e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+D84D U+1F618 |");
1304e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+D84D U+1F618 |");
1314e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+D84D U+1F618 |");
1324e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+D84D U+1F618 |");
1334e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+D84D U+1F618 |");
1344e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1354e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+1F618 U+D84D |");
1364e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+1F618 U+D84D |");
1374e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+1F618 U+D84D |");
1384e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+1F618 U+D84D |");
1394e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+1F618 U+D84D |");
1404e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1414e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // U+DE0D is trailing surrogate but there is no leading surrogate for it.
1424e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+DE0D U+1F618 |");
1434e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+DE0D U+1F618 |");
1444e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+DE0D U+1F618 |");
1454e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+DE0D U+1F618 |");
1464e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+DE0D U+1F618 |");
1474e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1484e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+1F618 U+DE0D |");
1494e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+1F618 U+DE0D |");
1504e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+1F618 U+DE0D |");
1514e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+1F618 U+DE0D |");
1524e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+1F618 U+DE0D |");
1534e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1544e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Regional indicator pair. U+1F1FA U+1F1F8 is US national flag.
1554e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+1F1FA U+1F1F8 |");
1564e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+1F1FA U+1F1F8 |");
1574e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+1F1FA U+1F1F8 |");
1584e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+1F1FA U+1F1F8 |");
1594e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1604e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Tone marks.
1614e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK ideographic char + Tone mark + CJK ideographic char
1624e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+4444 U+302D | U+4444");
1634e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+4444 U+302D | U+4444");
1644e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+4444 U+302D U+4444 |");
1654e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+4444 U+302D U+4444 |");
1664e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+4444 U+302D U+4444 |");
1674e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1684e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Variation Selectors.
1694e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK Ideographic char + Variation Selector(VS1) + CJK Ideographic char
1704e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+845B U+FE00 | U+845B");
1714e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+845B U+FE00 | U+845B");
1724e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+845B U+FE00 U+845B |");
1734e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+845B U+FE00 U+845B |");
1744e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+845B U+FE00 U+845B |");
1754e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1764e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK Ideographic char + Variation Selector(VS17) + CJK Ideographic char
1774e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+845B U+E0100 | U+845B");
1784e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+845B U+E0100 | U+845B");
1794e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+845B U+E0100 | U+845B");
1804e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+845B U+E0100 U+845B |");
1814e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+845B U+E0100 U+845B |");
1824e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(5, "U+845B U+E0100 U+845B |");
1834e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+845B U+E0100 U+845B |");
1844e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1854e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK ideographic char + Tone mark + Variation Character(VS1)
1864e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+4444 U+302D U+FE00 | U+4444");
1874e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+4444 U+302D U+FE00 | U+4444");
1884e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+4444 U+302D U+FE00 | U+4444");
1894e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+4444 U+302D U+FE00 U+4444 |");
1904e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+4444 U+302D U+FE00 U+4444 |");
1914e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+4444 U+302D U+FE00 U+4444 |");
1924e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
1934e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK ideographic char + Tone mark + Variation Character(VS17)
1944e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+4444 U+302D U+E0100 | U+4444");
1954e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+4444 U+302D U+E0100 | U+4444");
1964e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+4444 U+302D U+E0100 | U+4444");
1974e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+4444 U+302D U+E0100 | U+4444");
1984e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+4444 U+302D U+E0100 U+4444 |");
1994e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(5, "U+4444 U+302D U+E0100 U+4444 |");
2004e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+4444 U+302D U+E0100 U+4444 |");
2014e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2024e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK ideographic char + Variation Character(VS1) + Tone mark
2034e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+4444 U+FE00 U+302D | U+4444");
2044e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+4444 U+FE00 U+302D | U+4444");
2054e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+4444 U+FE00 U+302D | U+4444");
2064e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+4444 U+FE00 U+302D U+4444 |");
2074e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+4444 U+FE00 U+302D U+4444 |");
2084e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+4444 U+FE00 U+302D U+4444 |");
2094e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2104e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK ideographic char + Variation Character(VS17) + Tone mark
2114e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+4444 U+E0100 U+302D | U+4444");
2124e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+4444 U+E0100 U+302D | U+4444");
2134e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+4444 U+E0100 U+302D | U+4444");
2144e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+4444 U+E0100 U+302D | U+4444");
2154e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+4444 U+E0100 U+302D U+4444 |");
2164e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(5, "U+4444 U+E0100 U+302D U+4444 |");
2174e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+4444 U+E0100 U+302D U+4444 |");
2184e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2194e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Following test cases are unusual usage of variation selectors and tone
2204e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // marks for caching up the further behavior changes, e.g. index of bounds
2214e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // or crashes. Please feel free to update the test expectations if the
2224e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // behavior change makes sense to you.
2234e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2244e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Isolated Tone marks and Variation Selectors
2254e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+FE00 |");
2264e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+FE00 |");
2274e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+FE00 |");
2284e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+E0100 |");
2294e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+E0100 |");
2304e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+302D |");
2314e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+302D |");
2324e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2334e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK Ideographic char + Variation Selector(VS1) + Variation Selector(VS1)
2344e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+845B U+FE00 U+FE00 | U+845B");
2354e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+845B U+FE00 U+FE00 | U+845B");
2364e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+845B U+FE00 U+FE00 | U+845B");
2374e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+845B U+FE00 U+FE00 U+845B |");
2384e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+845B U+FE00 U+FE00 U+845B |");
2394e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+845B U+FE00 U+FE00 U+845B |");
2404e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2414e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK Ideographic char + Variation Selector(VS17) + Variation Selector(VS17)
2424e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+845B U+E0100 U+E0100 | U+845B");
2434e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+845B U+E0100 U+E0100 | U+845B");
2444e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+845B U+E0100 U+E0100 | U+845B");
2454e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+845B U+E0100 U+E0100 | U+845B");
2464e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+845B U+E0100 U+E0100 | U+845B");
2474e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(5, "U+845B U+E0100 U+E0100 U+845B |");
2484e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(6, "U+845B U+E0100 U+E0100 U+845B |");
2494e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000,
2504e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka                             "U+845B U+E0100 U+E0100 U+845B |");
2514e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2524e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK Ideographic char + Variation Selector(VS1) + Variation Selector(VS17)
2534e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+845B U+FE00 U+E0100 | U+845B");
2544e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+845B U+FE00 U+E0100 | U+845B");
2554e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+845B U+FE00 U+E0100 | U+845B");
2564e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+845B U+FE00 U+E0100 | U+845B");
2574e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+845B U+FE00 U+E0100 U+845B |");
2584e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(5, "U+845B U+FE00 U+E0100 U+845B |");
2594e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+845B U+FE00 U+E0100 U+845B |");
2604e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2614e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK Ideographic char + Variation Selector(VS17) + Variation Selector(VS1)
2624e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+845B U+E0100 U+FE00 | U+845B");
2634e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+845B U+E0100 U+FE00 | U+845B");
2644e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+845B U+E0100 U+FE00 | U+845B");
2654e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+845B U+E0100 U+FE00 | U+845B");
2664e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+845B U+E0100 U+FE00 U+845B |");
2674e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(5, "U+845B U+E0100 U+FE00 U+845B |");
2684e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+845B U+E0100 U+FE00 U+845B |");
2694e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2704e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Tone mark. + Tone mark
2714e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(0, "U+4444 U+302D U+302D | U+4444");
2724e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1, "U+4444 U+302D U+302D | U+4444");
2734e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(2, "U+4444 U+302D U+302D | U+4444");
2744e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(3, "U+4444 U+302D U+302D U+4444 |");
2754e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(4, "U+4444 U+302D U+302D U+4444 |");
2764e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectNextWordBreakForCache(1000, "U+4444 U+302D U+302D U+4444 |");
2774e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka}
2784e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2794e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo NonakaTEST(WordBreakTest, goPrevWordBreakTest) {
2804e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "|");
2814e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2824e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Continue for spaces.
2834e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| 'a' 'b' 'c' 'd'");
2844e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| 'a' 'b' 'c' 'd'");
2854e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| 'a' 'b' 'c' 'd'");
2864e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| 'a' 'b' 'c' 'd'");
2874e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "| 'a' 'b' 'c' 'd'");
2884e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "| 'a' 'b' 'c' 'd'");
2894e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2904e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Space makes word break.
2914e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| 'a' 'b' U+0020 'c' 'd'");
2924e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| 'a' 'b' U+0020 'c' 'd'");
2934e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| 'a' 'b' U+0020 'c' 'd'");
2944e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "'a' 'b' | U+0020 'c' 'd'");
2954e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "'a' 'b' U+0020 | 'c' 'd'");
2964e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(5, "'a' 'b' U+0020 | 'c' 'd'");
2974e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "'a' 'b' U+0020 | 'c' 'd'");
2984e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
2994e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| 'a' 'b' U+2000 'c' 'd'");
3004e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| 'a' 'b' U+2000 'c' 'd'");
3014e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| 'a' 'b' U+2000 'c' 'd'");
3024e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "'a' 'b' | U+2000 'c' 'd'");
3034e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "'a' 'b' U+2000 | 'c' 'd'");
3044e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(5, "'a' 'b' U+2000 | 'c' 'd'");
3054e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "'a' 'b' U+2000 | 'c' 'd'");
3064e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3074e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| 'a' 'b' U+2000 U+2000 'c' 'd'");
3084e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| 'a' 'b' U+2000 U+2000 'c' 'd'");
3094e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| 'a' 'b' U+2000 U+2000 'c' 'd'");
3104e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "'a' 'b' | U+2000 U+2000 'c' 'd'");
3114e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "'a' 'b' U+2000 | U+2000 'c' 'd'");
3124e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(5, "'a' 'b' U+2000 U+2000 | 'c' 'd'");
3134e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(6, "'a' 'b' U+2000 U+2000 | 'c' 'd'");
3144e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "'a' 'b' U+2000 U+2000 | 'c' 'd'");
3154e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3164e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK ideographs makes word break.
3174e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+4E00 U+4E00 U+4E00 U+4E00 U+4E00");
3184e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+4E00 U+4E00 U+4E00 U+4E00 U+4E00");
3194e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "U+4E00 | U+4E00 U+4E00 U+4E00 U+4E00");
3204e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "U+4E00 U+4E00 | U+4E00 U+4E00 U+4E00");
3214e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "U+4E00 U+4E00 U+4E00 | U+4E00 U+4E00");
3224e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(5, "U+4E00 U+4E00 U+4E00 U+4E00 | U+4E00");
3234e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+4E00 U+4E00 U+4E00 U+4E00 | U+4E00");
3244e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3254e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+4E00 U+4E8C U+4E09 U+56DB U+4E94");
3264e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+4E00 U+4E8C U+4E09 U+56DB U+4E94");
3274e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "U+4E00 | U+4E8C U+4E09 U+56DB U+4E94");
3284e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "U+4E00 U+4E8C | U+4E09 U+56DB U+4E94");
3294e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "U+4E00 U+4E8C U+4E09 | U+56DB U+4E94");
3304e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(5, "U+4E00 U+4E8C U+4E09 U+56DB | U+4E94");
3314e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+4E00 U+4E8C U+4E09 U+56DB | U+4E94");
3324e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3334e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Mixed case.
3344e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+4E00 'a' 'b' U+2000 'c' U+4E00");
3354e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+4E00 'a' 'b' U+2000 'c' U+4E00");
3364e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+4E00 'a' 'b' U+2000 'c' U+4E00");
3374e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+4E00 'a' 'b' U+2000 'c' U+4E00");
3384e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "U+4E00 'a' 'b' | U+2000 'c' U+4E00");
3394e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(5, "U+4E00 'a' 'b' U+2000 | 'c' U+4E00");
3404e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(6, "U+4E00 'a' 'b' U+2000 'c' | U+4E00");
3414e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+4E00 'a' 'b' U+2000 'c' | U+4E00");
3424e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3434e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Continue if trailing characters is Unicode combining characters.
3444e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+4E00 U+0332 U+4E00");
3454e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+4E00 U+0332 U+4E00");
3464e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+4E00 U+0332 U+4E00");
3474e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "U+4E00 U+0332 | U+4E00");
3484e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+4E00 U+0332 | U+4E00");
3494e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3504e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Surrogate pairs.
3514e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+1F60D U+1F618");
3524e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+1F60D U+1F618");
3534e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+1F60D U+1F618");
3544e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+1F60D U+1F618");
3554e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "| U+1F60D U+1F618");
3564e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "| U+1F60D U+1F618");
3574e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3584e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Broken surrogate pairs.
3594e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // U+D84D is leading surrogate but there is no trailing surrogate for it.
3604e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+D84D U+1F618");
3614e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+D84D U+1F618");
3624e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+D84D U+1F618");
3634e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+D84D U+1F618");
3644e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "| U+D84D U+1F618");
3654e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3664e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+1F618 U+D84D");
3674e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+1F618 U+D84D");
3684e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+1F618 U+D84D");
3694e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+1F618 U+D84D");
3704e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "| U+1F618 U+D84D");
3714e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3724e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // U+DE0D is trailing surrogate but there is no leading surrogate for it.
3734e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+DE0D U+1F618");
3744e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+DE0D U+1F618");
3754e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+DE0D U+1F618");
3764e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+DE0D U+1F618");
3774e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "| U+DE0D U+1F618");
3784e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3794e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+1F618 U+DE0D");
3804e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+1F618 U+DE0D");
3814e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+1F618 U+DE0D");
3824e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+1F618 U+DE0D");
3834e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "| U+1F618 U+DE0D");
3844e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3854e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Regional indicator pair. U+1F1FA U+1F1F8 is US national flag.
3864e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+1F1FA U+1F1F8");
3874e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+1F1FA U+1F1F8");
3884e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+1F1FA U+1F1F8");
3894e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "| U+1F1FA U+1F1F8");
3904e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3914e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Tone marks.
3924e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK ideographic char + Tone mark + CJK ideographic char
3934e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+4444 U+302D U+4444");
3944e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+4444 U+302D U+4444");
3954e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+4444 U+302D U+4444");
3964e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "U+4444 U+302D | U+4444");
3974e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+4444 U+302D | U+4444");
3984e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
3994e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Variation Selectors.
4004e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK Ideographic char + Variation Selector(VS1) + CJK Ideographic char
4014e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+845B U+FE00 U+845B");
4024e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+845B U+FE00 U+845B");
4034e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+845B U+FE00 U+845B");
4044e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "U+845B U+FE00 | U+845B");
4054e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+845B U+FE00 | U+845B");
4064e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
4074e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK Ideographic char + Variation Selector(VS17) + CJK Ideographic char
4084e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+845B U+E0100 U+845B");
4094e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+845B U+E0100 U+845B");
4104e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+845B U+E0100 U+845B");
4114e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+845B U+E0100 U+845B");
4124e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "U+845B U+E0100 | U+845B");
4134e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(5, "U+845B U+E0100 | U+845B");
4144e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+845B U+E0100 | U+845B");
4154e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
4164e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK ideographic char + Tone mark + Variation Character(VS1)
4174e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+4444 U+302D U+FE00 U+4444");
4184e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+4444 U+302D U+FE00 U+4444");
4194e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+4444 U+302D U+FE00 U+4444");
4204e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+4444 U+302D U+FE00 U+4444");
4214e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "U+4444 U+302D U+FE00 | U+4444");
4224e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+4444 U+302D U+FE00 | U+4444");
4234e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
4244e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK ideographic char + Tone mark + Variation Character(VS17)
4254e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+4444 U+302D U+E0100 U+4444");
4264e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+4444 U+302D U+E0100 U+4444");
4274e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+4444 U+302D U+E0100 U+4444");
4284e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+4444 U+302D U+E0100 U+4444");
4294e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "| U+4444 U+302D U+E0100 U+4444");
4304e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(5, "U+4444 U+302D U+E0100 | U+4444");
4314e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+4444 U+302D U+E0100 | U+4444");
4324e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
4334e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK ideographic char + Variation Character(VS1) + Tone mark
4344e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+4444 U+FE00 U+302D U+4444");
4354e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+4444 U+FE00 U+302D U+4444");
4364e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+4444 U+FE00 U+302D U+4444");
4374e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+4444 U+FE00 U+302D U+4444");
4384e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "U+4444 U+FE00 U+302D | U+4444");
4394e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+4444 U+FE00 U+302D | U+4444");
4404e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
4414e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK ideographic char + Variation Character(VS17) + Tone mark
4424e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+4444 U+E0100 U+302D U+4444");
4434e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+4444 U+E0100 U+302D U+4444");
4444e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+4444 U+E0100 U+302D U+4444");
4454e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+4444 U+E0100 U+302D U+4444");
4464e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "| U+4444 U+E0100 U+302D U+4444");
4474e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(5, "U+4444 U+E0100 U+302D | U+4444");
4484e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+4444 U+E0100 U+302D | U+4444");
4494e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
4504e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Following test cases are unusual usage of variation selectors and tone
4514e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // marks for caching up the further behavior changes, e.g. index of bounds
4524e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // or crashes. Please feel free to update the test expectations if the
4534e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // behavior change makes sense to you.
4544e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
4554e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Isolated Tone marks and Variation Selectors
4564e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+FE00");
4574e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+FE00");
4584e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "| U+FE00");
4594e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+E0100");
4604e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "| U+E0100");
4614e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+302D");
4624e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "| U+302D");
4634e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
4644e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK Ideographic char + Variation Selector(VS1) + Variation Selector(VS1)
4654e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+845B U+FE00 U+FE00 U+845B");
4664e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+845B U+FE00 U+FE00 U+845B");
4674e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+845B U+FE00 U+FE00 U+845B");
4684e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+845B U+FE00 U+FE00 U+845B");
4694e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "U+845B U+FE00 U+FE00 | U+845B");
4704e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+845B U+FE00 U+FE00 | U+845B");
4714e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
4724e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK Ideographic char + Variation Selector(VS17) + Variation Selector(VS17)
4734e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+845B U+E0100 U+E0100 U+845B");
4744e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+845B U+E0100 U+E0100 U+845B");
4754e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+845B U+E0100 U+E0100 U+845B");
4764e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+845B U+E0100 U+E0100 U+845B");
4774e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "| U+845B U+E0100 U+E0100 U+845B");
4784e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(5, "| U+845B U+E0100 U+E0100 U+845B");
4794e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(6, "U+845B U+E0100 U+E0100 | U+845B");
4804e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000,
4814e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka                             "U+845B U+E0100 U+E0100 | U+845B");
4824e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
4834e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK Ideographic char + Variation Selector(VS1) + Variation Selector(VS17)
4844e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+845B U+FE00 U+E0100 U+845B");
4854e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+845B U+FE00 U+E0100 U+845B");
4864e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+845B U+FE00 U+E0100 U+845B");
4874e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+845B U+FE00 U+E0100 U+845B");
4884e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "| U+845B U+FE00 U+E0100 U+845B");
4894e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(5, "U+845B U+FE00 U+E0100 | U+845B");
4904e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+845B U+FE00 U+E0100 | U+845B");
4914e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
4924e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // CJK Ideographic char + Variation Selector(VS17) + Variation Selector(VS1)
4934e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+845B U+E0100 U+FE00 U+845B");
4944e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+845B U+E0100 U+FE00 U+845B");
4954e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+845B U+E0100 U+FE00 U+845B");
4964e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+845B U+E0100 U+FE00 U+845B");
4974e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "| U+845B U+E0100 U+FE00 U+845B");
4984e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(5, "U+845B U+E0100 U+FE00 | U+845B");
4994e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+845B U+E0100 U+FE00 | U+845B");
5004e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
5014e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    // Tone mark. + Tone mark
5024e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(0, "| U+4444 U+302D U+302D U+4444");
5034e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1, "| U+4444 U+302D U+302D U+4444");
5044e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(2, "| U+4444 U+302D U+302D U+4444");
5054e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(3, "| U+4444 U+302D U+302D U+4444");
5064e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(4, "U+4444 U+302D U+302D | U+4444");
5074e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka    ExpectPrevWordBreakForCache(1000, "U+4444 U+302D U+302D | U+4444");
5084e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka}
5094e3adc6fb2073d5b466b88b8f5329d281038aba1Seigo Nonaka
51014e2d136aaef271ba131f917cf5f27baa31ae5adSeigo Nonaka}  // namespace minikin
511