Optimize RenderText::offsetNext for 8 bit strings
authorabarth@webkit.org <abarth@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 29 May 2013 19:26:16 +0000 (19:26 +0000)
committerabarth@webkit.org <abarth@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 29 May 2013 19:26:16 +0000 (19:26 +0000)
https://bugs.webkit.org/show_bug.cgi?id=116877

Reviewed by Darin Adler.

Source/WebCore:

Previously, this function was always upconverting strings to 16 bits in
order to create a cursorMovementIterator. This patch adds a fast path
for ASCII and Latin-1 strings, which don't need this complicated cursor
movement logic.

I ran into this code because nextOffset showed up as a memory pig on a
memory profile of Mobile Gmail.

Test: editing/selection/move-by-character-brute-force.html

* rendering/RenderText.cpp:
(WebCore::RenderText::previousOffset):
(WebCore::RenderText::nextOffset):

LayoutTests:

Test that caret movement works correctly for many code points.

* editing/selection/move-by-character-brute-force-expected.txt: Added.
* editing/selection/move-by-character-brute-force.html: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@150922 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/editing/selection/move-by-character-brute-force-expected.txt [new file with mode: 0644]
LayoutTests/editing/selection/move-by-character-brute-force.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderText.cpp

index 0f25ff7..b5899b1 100644 (file)
@@ -1,3 +1,15 @@
+2013-05-29  Adam Barth  <abarth@webkit.org>
+
+        Optimize RenderText::offsetNext for 8 bit strings
+        https://bugs.webkit.org/show_bug.cgi?id=116877
+
+        Reviewed by Darin Adler.
+
+        Test that caret movement works correctly for many code points.
+
+        * editing/selection/move-by-character-brute-force-expected.txt: Added.
+        * editing/selection/move-by-character-brute-force.html: Added.
+
 2013-05-29  Zan Dobersek  <zdobersek@igalia.com>
 
         Unreviewed GTK gardening, managing media layout tests failures on GTK WK2.
diff --git a/LayoutTests/editing/selection/move-by-character-brute-force-expected.txt b/LayoutTests/editing/selection/move-by-character-brute-force-expected.txt
new file mode 100644 (file)
index 0000000..b0708c9
--- /dev/null
@@ -0,0 +1,1039 @@
+This test checks that we have simple caret motion up to a certain limit
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Positive control:
+PASS hasSimpleCaretMovement(0x0041) is true
+
+Negative control:
+PASS hasSimpleCaretMovement(0x0300) is false
+
+Brute force:
+PASS hasSimpleCaretMovement(i) // i = U+0001 is true
+PASS hasSimpleCaretMovement(i) // i = U+0002 is true
+PASS hasSimpleCaretMovement(i) // i = U+0003 is true
+PASS hasSimpleCaretMovement(i) // i = U+0004 is true
+PASS hasSimpleCaretMovement(i) // i = U+0005 is true
+PASS hasSimpleCaretMovement(i) // i = U+0006 is true
+PASS hasSimpleCaretMovement(i) // i = U+0007 is true
+PASS hasSimpleCaretMovement(i) // i = U+0008 is true
+PASS hasSimpleCaretMovement(i) // i = U+0009 is true
+PASS hasSimpleCaretMovement(i) // i = U+000a is true
+PASS hasSimpleCaretMovement(i) // i = U+000b is true
+PASS hasSimpleCaretMovement(i) // i = U+000c is true
+PASS hasSimpleCaretMovement(i) // i = U+000d is true
+PASS hasSimpleCaretMovement(i) // i = U+000e is true
+PASS hasSimpleCaretMovement(i) // i = U+000f is true
+PASS hasSimpleCaretMovement(i) // i = U+0010 is true
+PASS hasSimpleCaretMovement(i) // i = U+0011 is true
+PASS hasSimpleCaretMovement(i) // i = U+0012 is true
+PASS hasSimpleCaretMovement(i) // i = U+0013 is true
+PASS hasSimpleCaretMovement(i) // i = U+0014 is true
+PASS hasSimpleCaretMovement(i) // i = U+0015 is true
+PASS hasSimpleCaretMovement(i) // i = U+0016 is true
+PASS hasSimpleCaretMovement(i) // i = U+0017 is true
+PASS hasSimpleCaretMovement(i) // i = U+0018 is true
+PASS hasSimpleCaretMovement(i) // i = U+0019 is true
+PASS hasSimpleCaretMovement(i) // i = U+001a is true
+PASS hasSimpleCaretMovement(i) // i = U+001b is true
+PASS hasSimpleCaretMovement(i) // i = U+001c is true
+PASS hasSimpleCaretMovement(i) // i = U+001d is true
+PASS hasSimpleCaretMovement(i) // i = U+001e is true
+PASS hasSimpleCaretMovement(i) // i = U+001f is true
+PASS hasSimpleCaretMovement(i) // i = U+0020 is true
+PASS hasSimpleCaretMovement(i) // i = U+0021 is true
+PASS hasSimpleCaretMovement(i) // i = U+0022 is true
+PASS hasSimpleCaretMovement(i) // i = U+0023 is true
+PASS hasSimpleCaretMovement(i) // i = U+0024 is true
+PASS hasSimpleCaretMovement(i) // i = U+0025 is true
+PASS hasSimpleCaretMovement(i) // i = U+0026 is true
+PASS hasSimpleCaretMovement(i) // i = U+0027 is true
+PASS hasSimpleCaretMovement(i) // i = U+0028 is true
+PASS hasSimpleCaretMovement(i) // i = U+0029 is true
+PASS hasSimpleCaretMovement(i) // i = U+002a is true
+PASS hasSimpleCaretMovement(i) // i = U+002b is true
+PASS hasSimpleCaretMovement(i) // i = U+002c is true
+PASS hasSimpleCaretMovement(i) // i = U+002d is true
+PASS hasSimpleCaretMovement(i) // i = U+002e is true
+PASS hasSimpleCaretMovement(i) // i = U+002f is true
+PASS hasSimpleCaretMovement(i) // i = U+0030 is true
+PASS hasSimpleCaretMovement(i) // i = U+0031 is true
+PASS hasSimpleCaretMovement(i) // i = U+0032 is true
+PASS hasSimpleCaretMovement(i) // i = U+0033 is true
+PASS hasSimpleCaretMovement(i) // i = U+0034 is true
+PASS hasSimpleCaretMovement(i) // i = U+0035 is true
+PASS hasSimpleCaretMovement(i) // i = U+0036 is true
+PASS hasSimpleCaretMovement(i) // i = U+0037 is true
+PASS hasSimpleCaretMovement(i) // i = U+0038 is true
+PASS hasSimpleCaretMovement(i) // i = U+0039 is true
+PASS hasSimpleCaretMovement(i) // i = U+003a is true
+PASS hasSimpleCaretMovement(i) // i = U+003b is true
+PASS hasSimpleCaretMovement(i) // i = U+003c is true
+PASS hasSimpleCaretMovement(i) // i = U+003d is true
+PASS hasSimpleCaretMovement(i) // i = U+003e is true
+PASS hasSimpleCaretMovement(i) // i = U+003f is true
+PASS hasSimpleCaretMovement(i) // i = U+0040 is true
+PASS hasSimpleCaretMovement(i) // i = U+0041 is true
+PASS hasSimpleCaretMovement(i) // i = U+0042 is true
+PASS hasSimpleCaretMovement(i) // i = U+0043 is true
+PASS hasSimpleCaretMovement(i) // i = U+0044 is true
+PASS hasSimpleCaretMovement(i) // i = U+0045 is true
+PASS hasSimpleCaretMovement(i) // i = U+0046 is true
+PASS hasSimpleCaretMovement(i) // i = U+0047 is true
+PASS hasSimpleCaretMovement(i) // i = U+0048 is true
+PASS hasSimpleCaretMovement(i) // i = U+0049 is true
+PASS hasSimpleCaretMovement(i) // i = U+004a is true
+PASS hasSimpleCaretMovement(i) // i = U+004b is true
+PASS hasSimpleCaretMovement(i) // i = U+004c is true
+PASS hasSimpleCaretMovement(i) // i = U+004d is true
+PASS hasSimpleCaretMovement(i) // i = U+004e is true
+PASS hasSimpleCaretMovement(i) // i = U+004f is true
+PASS hasSimpleCaretMovement(i) // i = U+0050 is true
+PASS hasSimpleCaretMovement(i) // i = U+0051 is true
+PASS hasSimpleCaretMovement(i) // i = U+0052 is true
+PASS hasSimpleCaretMovement(i) // i = U+0053 is true
+PASS hasSimpleCaretMovement(i) // i = U+0054 is true
+PASS hasSimpleCaretMovement(i) // i = U+0055 is true
+PASS hasSimpleCaretMovement(i) // i = U+0056 is true
+PASS hasSimpleCaretMovement(i) // i = U+0057 is true
+PASS hasSimpleCaretMovement(i) // i = U+0058 is true
+PASS hasSimpleCaretMovement(i) // i = U+0059 is true
+PASS hasSimpleCaretMovement(i) // i = U+005a is true
+PASS hasSimpleCaretMovement(i) // i = U+005b is true
+PASS hasSimpleCaretMovement(i) // i = U+005c is true
+PASS hasSimpleCaretMovement(i) // i = U+005d is true
+PASS hasSimpleCaretMovement(i) // i = U+005e is true
+PASS hasSimpleCaretMovement(i) // i = U+005f is true
+PASS hasSimpleCaretMovement(i) // i = U+0060 is true
+PASS hasSimpleCaretMovement(i) // i = U+0061 is true
+PASS hasSimpleCaretMovement(i) // i = U+0062 is true
+PASS hasSimpleCaretMovement(i) // i = U+0063 is true
+PASS hasSimpleCaretMovement(i) // i = U+0064 is true
+PASS hasSimpleCaretMovement(i) // i = U+0065 is true
+PASS hasSimpleCaretMovement(i) // i = U+0066 is true
+PASS hasSimpleCaretMovement(i) // i = U+0067 is true
+PASS hasSimpleCaretMovement(i) // i = U+0068 is true
+PASS hasSimpleCaretMovement(i) // i = U+0069 is true
+PASS hasSimpleCaretMovement(i) // i = U+006a is true
+PASS hasSimpleCaretMovement(i) // i = U+006b is true
+PASS hasSimpleCaretMovement(i) // i = U+006c is true
+PASS hasSimpleCaretMovement(i) // i = U+006d is true
+PASS hasSimpleCaretMovement(i) // i = U+006e is true
+PASS hasSimpleCaretMovement(i) // i = U+006f is true
+PASS hasSimpleCaretMovement(i) // i = U+0070 is true
+PASS hasSimpleCaretMovement(i) // i = U+0071 is true
+PASS hasSimpleCaretMovement(i) // i = U+0072 is true
+PASS hasSimpleCaretMovement(i) // i = U+0073 is true
+PASS hasSimpleCaretMovement(i) // i = U+0074 is true
+PASS hasSimpleCaretMovement(i) // i = U+0075 is true
+PASS hasSimpleCaretMovement(i) // i = U+0076 is true
+PASS hasSimpleCaretMovement(i) // i = U+0077 is true
+PASS hasSimpleCaretMovement(i) // i = U+0078 is true
+PASS hasSimpleCaretMovement(i) // i = U+0079 is true
+PASS hasSimpleCaretMovement(i) // i = U+007a is true
+PASS hasSimpleCaretMovement(i) // i = U+007b is true
+PASS hasSimpleCaretMovement(i) // i = U+007c is true
+PASS hasSimpleCaretMovement(i) // i = U+007d is true
+PASS hasSimpleCaretMovement(i) // i = U+007e is true
+PASS hasSimpleCaretMovement(i) // i = U+007f is true
+PASS hasSimpleCaretMovement(i) // i = U+0080 is true
+PASS hasSimpleCaretMovement(i) // i = U+0081 is true
+PASS hasSimpleCaretMovement(i) // i = U+0082 is true
+PASS hasSimpleCaretMovement(i) // i = U+0083 is true
+PASS hasSimpleCaretMovement(i) // i = U+0084 is true
+PASS hasSimpleCaretMovement(i) // i = U+0085 is true
+PASS hasSimpleCaretMovement(i) // i = U+0086 is true
+PASS hasSimpleCaretMovement(i) // i = U+0087 is true
+PASS hasSimpleCaretMovement(i) // i = U+0088 is true
+PASS hasSimpleCaretMovement(i) // i = U+0089 is true
+PASS hasSimpleCaretMovement(i) // i = U+008a is true
+PASS hasSimpleCaretMovement(i) // i = U+008b is true
+PASS hasSimpleCaretMovement(i) // i = U+008c is true
+PASS hasSimpleCaretMovement(i) // i = U+008d is true
+PASS hasSimpleCaretMovement(i) // i = U+008e is true
+PASS hasSimpleCaretMovement(i) // i = U+008f is true
+PASS hasSimpleCaretMovement(i) // i = U+0090 is true
+PASS hasSimpleCaretMovement(i) // i = U+0091 is true
+PASS hasSimpleCaretMovement(i) // i = U+0092 is true
+PASS hasSimpleCaretMovement(i) // i = U+0093 is true
+PASS hasSimpleCaretMovement(i) // i = U+0094 is true
+PASS hasSimpleCaretMovement(i) // i = U+0095 is true
+PASS hasSimpleCaretMovement(i) // i = U+0096 is true
+PASS hasSimpleCaretMovement(i) // i = U+0097 is true
+PASS hasSimpleCaretMovement(i) // i = U+0098 is true
+PASS hasSimpleCaretMovement(i) // i = U+0099 is true
+PASS hasSimpleCaretMovement(i) // i = U+009a is true
+PASS hasSimpleCaretMovement(i) // i = U+009b is true
+PASS hasSimpleCaretMovement(i) // i = U+009c is true
+PASS hasSimpleCaretMovement(i) // i = U+009d is true
+PASS hasSimpleCaretMovement(i) // i = U+009e is true
+PASS hasSimpleCaretMovement(i) // i = U+009f is true
+PASS hasSimpleCaretMovement(i) // i = U+00a0 is true
+PASS hasSimpleCaretMovement(i) // i = U+00a1 is true
+PASS hasSimpleCaretMovement(i) // i = U+00a2 is true
+PASS hasSimpleCaretMovement(i) // i = U+00a3 is true
+PASS hasSimpleCaretMovement(i) // i = U+00a4 is true
+PASS hasSimpleCaretMovement(i) // i = U+00a5 is true
+PASS hasSimpleCaretMovement(i) // i = U+00a6 is true
+PASS hasSimpleCaretMovement(i) // i = U+00a7 is true
+PASS hasSimpleCaretMovement(i) // i = U+00a8 is true
+PASS hasSimpleCaretMovement(i) // i = U+00a9 is true
+PASS hasSimpleCaretMovement(i) // i = U+00aa is true
+PASS hasSimpleCaretMovement(i) // i = U+00ab is true
+PASS hasSimpleCaretMovement(i) // i = U+00ac is true
+PASS hasSimpleCaretMovement(i) // i = U+00ad is true
+PASS hasSimpleCaretMovement(i) // i = U+00ae is true
+PASS hasSimpleCaretMovement(i) // i = U+00af is true
+PASS hasSimpleCaretMovement(i) // i = U+00b0 is true
+PASS hasSimpleCaretMovement(i) // i = U+00b1 is true
+PASS hasSimpleCaretMovement(i) // i = U+00b2 is true
+PASS hasSimpleCaretMovement(i) // i = U+00b3 is true
+PASS hasSimpleCaretMovement(i) // i = U+00b4 is true
+PASS hasSimpleCaretMovement(i) // i = U+00b5 is true
+PASS hasSimpleCaretMovement(i) // i = U+00b6 is true
+PASS hasSimpleCaretMovement(i) // i = U+00b7 is true
+PASS hasSimpleCaretMovement(i) // i = U+00b8 is true
+PASS hasSimpleCaretMovement(i) // i = U+00b9 is true
+PASS hasSimpleCaretMovement(i) // i = U+00ba is true
+PASS hasSimpleCaretMovement(i) // i = U+00bb is true
+PASS hasSimpleCaretMovement(i) // i = U+00bc is true
+PASS hasSimpleCaretMovement(i) // i = U+00bd is true
+PASS hasSimpleCaretMovement(i) // i = U+00be is true
+PASS hasSimpleCaretMovement(i) // i = U+00bf is true
+PASS hasSimpleCaretMovement(i) // i = U+00c0 is true
+PASS hasSimpleCaretMovement(i) // i = U+00c1 is true
+PASS hasSimpleCaretMovement(i) // i = U+00c2 is true
+PASS hasSimpleCaretMovement(i) // i = U+00c3 is true
+PASS hasSimpleCaretMovement(i) // i = U+00c4 is true
+PASS hasSimpleCaretMovement(i) // i = U+00c5 is true
+PASS hasSimpleCaretMovement(i) // i = U+00c6 is true
+PASS hasSimpleCaretMovement(i) // i = U+00c7 is true
+PASS hasSimpleCaretMovement(i) // i = U+00c8 is true
+PASS hasSimpleCaretMovement(i) // i = U+00c9 is true
+PASS hasSimpleCaretMovement(i) // i = U+00ca is true
+PASS hasSimpleCaretMovement(i) // i = U+00cb is true
+PASS hasSimpleCaretMovement(i) // i = U+00cc is true
+PASS hasSimpleCaretMovement(i) // i = U+00cd is true
+PASS hasSimpleCaretMovement(i) // i = U+00ce is true
+PASS hasSimpleCaretMovement(i) // i = U+00cf is true
+PASS hasSimpleCaretMovement(i) // i = U+00d0 is true
+PASS hasSimpleCaretMovement(i) // i = U+00d1 is true
+PASS hasSimpleCaretMovement(i) // i = U+00d2 is true
+PASS hasSimpleCaretMovement(i) // i = U+00d3 is true
+PASS hasSimpleCaretMovement(i) // i = U+00d4 is true
+PASS hasSimpleCaretMovement(i) // i = U+00d5 is true
+PASS hasSimpleCaretMovement(i) // i = U+00d6 is true
+PASS hasSimpleCaretMovement(i) // i = U+00d7 is true
+PASS hasSimpleCaretMovement(i) // i = U+00d8 is true
+PASS hasSimpleCaretMovement(i) // i = U+00d9 is true
+PASS hasSimpleCaretMovement(i) // i = U+00da is true
+PASS hasSimpleCaretMovement(i) // i = U+00db is true
+PASS hasSimpleCaretMovement(i) // i = U+00dc is true
+PASS hasSimpleCaretMovement(i) // i = U+00dd is true
+PASS hasSimpleCaretMovement(i) // i = U+00de is true
+PASS hasSimpleCaretMovement(i) // i = U+00df is true
+PASS hasSimpleCaretMovement(i) // i = U+00e0 is true
+PASS hasSimpleCaretMovement(i) // i = U+00e1 is true
+PASS hasSimpleCaretMovement(i) // i = U+00e2 is true
+PASS hasSimpleCaretMovement(i) // i = U+00e3 is true
+PASS hasSimpleCaretMovement(i) // i = U+00e4 is true
+PASS hasSimpleCaretMovement(i) // i = U+00e5 is true
+PASS hasSimpleCaretMovement(i) // i = U+00e6 is true
+PASS hasSimpleCaretMovement(i) // i = U+00e7 is true
+PASS hasSimpleCaretMovement(i) // i = U+00e8 is true
+PASS hasSimpleCaretMovement(i) // i = U+00e9 is true
+PASS hasSimpleCaretMovement(i) // i = U+00ea is true
+PASS hasSimpleCaretMovement(i) // i = U+00eb is true
+PASS hasSimpleCaretMovement(i) // i = U+00ec is true
+PASS hasSimpleCaretMovement(i) // i = U+00ed is true
+PASS hasSimpleCaretMovement(i) // i = U+00ee is true
+PASS hasSimpleCaretMovement(i) // i = U+00ef is true
+PASS hasSimpleCaretMovement(i) // i = U+00f0 is true
+PASS hasSimpleCaretMovement(i) // i = U+00f1 is true
+PASS hasSimpleCaretMovement(i) // i = U+00f2 is true
+PASS hasSimpleCaretMovement(i) // i = U+00f3 is true
+PASS hasSimpleCaretMovement(i) // i = U+00f4 is true
+PASS hasSimpleCaretMovement(i) // i = U+00f5 is true
+PASS hasSimpleCaretMovement(i) // i = U+00f6 is true
+PASS hasSimpleCaretMovement(i) // i = U+00f7 is true
+PASS hasSimpleCaretMovement(i) // i = U+00f8 is true
+PASS hasSimpleCaretMovement(i) // i = U+00f9 is true
+PASS hasSimpleCaretMovement(i) // i = U+00fa is true
+PASS hasSimpleCaretMovement(i) // i = U+00fb is true
+PASS hasSimpleCaretMovement(i) // i = U+00fc is true
+PASS hasSimpleCaretMovement(i) // i = U+00fd is true
+PASS hasSimpleCaretMovement(i) // i = U+00fe is true
+PASS hasSimpleCaretMovement(i) // i = U+00ff is true
+PASS hasSimpleCaretMovement(i) // i = U+0100 is true
+PASS hasSimpleCaretMovement(i) // i = U+0101 is true
+PASS hasSimpleCaretMovement(i) // i = U+0102 is true
+PASS hasSimpleCaretMovement(i) // i = U+0103 is true
+PASS hasSimpleCaretMovement(i) // i = U+0104 is true
+PASS hasSimpleCaretMovement(i) // i = U+0105 is true
+PASS hasSimpleCaretMovement(i) // i = U+0106 is true
+PASS hasSimpleCaretMovement(i) // i = U+0107 is true
+PASS hasSimpleCaretMovement(i) // i = U+0108 is true
+PASS hasSimpleCaretMovement(i) // i = U+0109 is true
+PASS hasSimpleCaretMovement(i) // i = U+010a is true
+PASS hasSimpleCaretMovement(i) // i = U+010b is true
+PASS hasSimpleCaretMovement(i) // i = U+010c is true
+PASS hasSimpleCaretMovement(i) // i = U+010d is true
+PASS hasSimpleCaretMovement(i) // i = U+010e is true
+PASS hasSimpleCaretMovement(i) // i = U+010f is true
+PASS hasSimpleCaretMovement(i) // i = U+0110 is true
+PASS hasSimpleCaretMovement(i) // i = U+0111 is true
+PASS hasSimpleCaretMovement(i) // i = U+0112 is true
+PASS hasSimpleCaretMovement(i) // i = U+0113 is true
+PASS hasSimpleCaretMovement(i) // i = U+0114 is true
+PASS hasSimpleCaretMovement(i) // i = U+0115 is true
+PASS hasSimpleCaretMovement(i) // i = U+0116 is true
+PASS hasSimpleCaretMovement(i) // i = U+0117 is true
+PASS hasSimpleCaretMovement(i) // i = U+0118 is true
+PASS hasSimpleCaretMovement(i) // i = U+0119 is true
+PASS hasSimpleCaretMovement(i) // i = U+011a is true
+PASS hasSimpleCaretMovement(i) // i = U+011b is true
+PASS hasSimpleCaretMovement(i) // i = U+011c is true
+PASS hasSimpleCaretMovement(i) // i = U+011d is true
+PASS hasSimpleCaretMovement(i) // i = U+011e is true
+PASS hasSimpleCaretMovement(i) // i = U+011f is true
+PASS hasSimpleCaretMovement(i) // i = U+0120 is true
+PASS hasSimpleCaretMovement(i) // i = U+0121 is true
+PASS hasSimpleCaretMovement(i) // i = U+0122 is true
+PASS hasSimpleCaretMovement(i) // i = U+0123 is true
+PASS hasSimpleCaretMovement(i) // i = U+0124 is true
+PASS hasSimpleCaretMovement(i) // i = U+0125 is true
+PASS hasSimpleCaretMovement(i) // i = U+0126 is true
+PASS hasSimpleCaretMovement(i) // i = U+0127 is true
+PASS hasSimpleCaretMovement(i) // i = U+0128 is true
+PASS hasSimpleCaretMovement(i) // i = U+0129 is true
+PASS hasSimpleCaretMovement(i) // i = U+012a is true
+PASS hasSimpleCaretMovement(i) // i = U+012b is true
+PASS hasSimpleCaretMovement(i) // i = U+012c is true
+PASS hasSimpleCaretMovement(i) // i = U+012d is true
+PASS hasSimpleCaretMovement(i) // i = U+012e is true
+PASS hasSimpleCaretMovement(i) // i = U+012f is true
+PASS hasSimpleCaretMovement(i) // i = U+0130 is true
+PASS hasSimpleCaretMovement(i) // i = U+0131 is true
+PASS hasSimpleCaretMovement(i) // i = U+0132 is true
+PASS hasSimpleCaretMovement(i) // i = U+0133 is true
+PASS hasSimpleCaretMovement(i) // i = U+0134 is true
+PASS hasSimpleCaretMovement(i) // i = U+0135 is true
+PASS hasSimpleCaretMovement(i) // i = U+0136 is true
+PASS hasSimpleCaretMovement(i) // i = U+0137 is true
+PASS hasSimpleCaretMovement(i) // i = U+0138 is true
+PASS hasSimpleCaretMovement(i) // i = U+0139 is true
+PASS hasSimpleCaretMovement(i) // i = U+013a is true
+PASS hasSimpleCaretMovement(i) // i = U+013b is true
+PASS hasSimpleCaretMovement(i) // i = U+013c is true
+PASS hasSimpleCaretMovement(i) // i = U+013d is true
+PASS hasSimpleCaretMovement(i) // i = U+013e is true
+PASS hasSimpleCaretMovement(i) // i = U+013f is true
+PASS hasSimpleCaretMovement(i) // i = U+0140 is true
+PASS hasSimpleCaretMovement(i) // i = U+0141 is true
+PASS hasSimpleCaretMovement(i) // i = U+0142 is true
+PASS hasSimpleCaretMovement(i) // i = U+0143 is true
+PASS hasSimpleCaretMovement(i) // i = U+0144 is true
+PASS hasSimpleCaretMovement(i) // i = U+0145 is true
+PASS hasSimpleCaretMovement(i) // i = U+0146 is true
+PASS hasSimpleCaretMovement(i) // i = U+0147 is true
+PASS hasSimpleCaretMovement(i) // i = U+0148 is true
+PASS hasSimpleCaretMovement(i) // i = U+0149 is true
+PASS hasSimpleCaretMovement(i) // i = U+014a is true
+PASS hasSimpleCaretMovement(i) // i = U+014b is true
+PASS hasSimpleCaretMovement(i) // i = U+014c is true
+PASS hasSimpleCaretMovement(i) // i = U+014d is true
+PASS hasSimpleCaretMovement(i) // i = U+014e is true
+PASS hasSimpleCaretMovement(i) // i = U+014f is true
+PASS hasSimpleCaretMovement(i) // i = U+0150 is true
+PASS hasSimpleCaretMovement(i) // i = U+0151 is true
+PASS hasSimpleCaretMovement(i) // i = U+0152 is true
+PASS hasSimpleCaretMovement(i) // i = U+0153 is true
+PASS hasSimpleCaretMovement(i) // i = U+0154 is true
+PASS hasSimpleCaretMovement(i) // i = U+0155 is true
+PASS hasSimpleCaretMovement(i) // i = U+0156 is true
+PASS hasSimpleCaretMovement(i) // i = U+0157 is true
+PASS hasSimpleCaretMovement(i) // i = U+0158 is true
+PASS hasSimpleCaretMovement(i) // i = U+0159 is true
+PASS hasSimpleCaretMovement(i) // i = U+015a is true
+PASS hasSimpleCaretMovement(i) // i = U+015b is true
+PASS hasSimpleCaretMovement(i) // i = U+015c is true
+PASS hasSimpleCaretMovement(i) // i = U+015d is true
+PASS hasSimpleCaretMovement(i) // i = U+015e is true
+PASS hasSimpleCaretMovement(i) // i = U+015f is true
+PASS hasSimpleCaretMovement(i) // i = U+0160 is true
+PASS hasSimpleCaretMovement(i) // i = U+0161 is true
+PASS hasSimpleCaretMovement(i) // i = U+0162 is true
+PASS hasSimpleCaretMovement(i) // i = U+0163 is true
+PASS hasSimpleCaretMovement(i) // i = U+0164 is true
+PASS hasSimpleCaretMovement(i) // i = U+0165 is true
+PASS hasSimpleCaretMovement(i) // i = U+0166 is true
+PASS hasSimpleCaretMovement(i) // i = U+0167 is true
+PASS hasSimpleCaretMovement(i) // i = U+0168 is true
+PASS hasSimpleCaretMovement(i) // i = U+0169 is true
+PASS hasSimpleCaretMovement(i) // i = U+016a is true
+PASS hasSimpleCaretMovement(i) // i = U+016b is true
+PASS hasSimpleCaretMovement(i) // i = U+016c is true
+PASS hasSimpleCaretMovement(i) // i = U+016d is true
+PASS hasSimpleCaretMovement(i) // i = U+016e is true
+PASS hasSimpleCaretMovement(i) // i = U+016f is true
+PASS hasSimpleCaretMovement(i) // i = U+0170 is true
+PASS hasSimpleCaretMovement(i) // i = U+0171 is true
+PASS hasSimpleCaretMovement(i) // i = U+0172 is true
+PASS hasSimpleCaretMovement(i) // i = U+0173 is true
+PASS hasSimpleCaretMovement(i) // i = U+0174 is true
+PASS hasSimpleCaretMovement(i) // i = U+0175 is true
+PASS hasSimpleCaretMovement(i) // i = U+0176 is true
+PASS hasSimpleCaretMovement(i) // i = U+0177 is true
+PASS hasSimpleCaretMovement(i) // i = U+0178 is true
+PASS hasSimpleCaretMovement(i) // i = U+0179 is true
+PASS hasSimpleCaretMovement(i) // i = U+017a is true
+PASS hasSimpleCaretMovement(i) // i = U+017b is true
+PASS hasSimpleCaretMovement(i) // i = U+017c is true
+PASS hasSimpleCaretMovement(i) // i = U+017d is true
+PASS hasSimpleCaretMovement(i) // i = U+017e is true
+PASS hasSimpleCaretMovement(i) // i = U+017f is true
+PASS hasSimpleCaretMovement(i) // i = U+0180 is true
+PASS hasSimpleCaretMovement(i) // i = U+0181 is true
+PASS hasSimpleCaretMovement(i) // i = U+0182 is true
+PASS hasSimpleCaretMovement(i) // i = U+0183 is true
+PASS hasSimpleCaretMovement(i) // i = U+0184 is true
+PASS hasSimpleCaretMovement(i) // i = U+0185 is true
+PASS hasSimpleCaretMovement(i) // i = U+0186 is true
+PASS hasSimpleCaretMovement(i) // i = U+0187 is true
+PASS hasSimpleCaretMovement(i) // i = U+0188 is true
+PASS hasSimpleCaretMovement(i) // i = U+0189 is true
+PASS hasSimpleCaretMovement(i) // i = U+018a is true
+PASS hasSimpleCaretMovement(i) // i = U+018b is true
+PASS hasSimpleCaretMovement(i) // i = U+018c is true
+PASS hasSimpleCaretMovement(i) // i = U+018d is true
+PASS hasSimpleCaretMovement(i) // i = U+018e is true
+PASS hasSimpleCaretMovement(i) // i = U+018f is true
+PASS hasSimpleCaretMovement(i) // i = U+0190 is true
+PASS hasSimpleCaretMovement(i) // i = U+0191 is true
+PASS hasSimpleCaretMovement(i) // i = U+0192 is true
+PASS hasSimpleCaretMovement(i) // i = U+0193 is true
+PASS hasSimpleCaretMovement(i) // i = U+0194 is true
+PASS hasSimpleCaretMovement(i) // i = U+0195 is true
+PASS hasSimpleCaretMovement(i) // i = U+0196 is true
+PASS hasSimpleCaretMovement(i) // i = U+0197 is true
+PASS hasSimpleCaretMovement(i) // i = U+0198 is true
+PASS hasSimpleCaretMovement(i) // i = U+0199 is true
+PASS hasSimpleCaretMovement(i) // i = U+019a is true
+PASS hasSimpleCaretMovement(i) // i = U+019b is true
+PASS hasSimpleCaretMovement(i) // i = U+019c is true
+PASS hasSimpleCaretMovement(i) // i = U+019d is true
+PASS hasSimpleCaretMovement(i) // i = U+019e is true
+PASS hasSimpleCaretMovement(i) // i = U+019f is true
+PASS hasSimpleCaretMovement(i) // i = U+01a0 is true
+PASS hasSimpleCaretMovement(i) // i = U+01a1 is true
+PASS hasSimpleCaretMovement(i) // i = U+01a2 is true
+PASS hasSimpleCaretMovement(i) // i = U+01a3 is true
+PASS hasSimpleCaretMovement(i) // i = U+01a4 is true
+PASS hasSimpleCaretMovement(i) // i = U+01a5 is true
+PASS hasSimpleCaretMovement(i) // i = U+01a6 is true
+PASS hasSimpleCaretMovement(i) // i = U+01a7 is true
+PASS hasSimpleCaretMovement(i) // i = U+01a8 is true
+PASS hasSimpleCaretMovement(i) // i = U+01a9 is true
+PASS hasSimpleCaretMovement(i) // i = U+01aa is true
+PASS hasSimpleCaretMovement(i) // i = U+01ab is true
+PASS hasSimpleCaretMovement(i) // i = U+01ac is true
+PASS hasSimpleCaretMovement(i) // i = U+01ad is true
+PASS hasSimpleCaretMovement(i) // i = U+01ae is true
+PASS hasSimpleCaretMovement(i) // i = U+01af is true
+PASS hasSimpleCaretMovement(i) // i = U+01b0 is true
+PASS hasSimpleCaretMovement(i) // i = U+01b1 is true
+PASS hasSimpleCaretMovement(i) // i = U+01b2 is true
+PASS hasSimpleCaretMovement(i) // i = U+01b3 is true
+PASS hasSimpleCaretMovement(i) // i = U+01b4 is true
+PASS hasSimpleCaretMovement(i) // i = U+01b5 is true
+PASS hasSimpleCaretMovement(i) // i = U+01b6 is true
+PASS hasSimpleCaretMovement(i) // i = U+01b7 is true
+PASS hasSimpleCaretMovement(i) // i = U+01b8 is true
+PASS hasSimpleCaretMovement(i) // i = U+01b9 is true
+PASS hasSimpleCaretMovement(i) // i = U+01ba is true
+PASS hasSimpleCaretMovement(i) // i = U+01bb is true
+PASS hasSimpleCaretMovement(i) // i = U+01bc is true
+PASS hasSimpleCaretMovement(i) // i = U+01bd is true
+PASS hasSimpleCaretMovement(i) // i = U+01be is true
+PASS hasSimpleCaretMovement(i) // i = U+01bf is true
+PASS hasSimpleCaretMovement(i) // i = U+01c0 is true
+PASS hasSimpleCaretMovement(i) // i = U+01c1 is true
+PASS hasSimpleCaretMovement(i) // i = U+01c2 is true
+PASS hasSimpleCaretMovement(i) // i = U+01c3 is true
+PASS hasSimpleCaretMovement(i) // i = U+01c4 is true
+PASS hasSimpleCaretMovement(i) // i = U+01c5 is true
+PASS hasSimpleCaretMovement(i) // i = U+01c6 is true
+PASS hasSimpleCaretMovement(i) // i = U+01c7 is true
+PASS hasSimpleCaretMovement(i) // i = U+01c8 is true
+PASS hasSimpleCaretMovement(i) // i = U+01c9 is true
+PASS hasSimpleCaretMovement(i) // i = U+01ca is true
+PASS hasSimpleCaretMovement(i) // i = U+01cb is true
+PASS hasSimpleCaretMovement(i) // i = U+01cc is true
+PASS hasSimpleCaretMovement(i) // i = U+01cd is true
+PASS hasSimpleCaretMovement(i) // i = U+01ce is true
+PASS hasSimpleCaretMovement(i) // i = U+01cf is true
+PASS hasSimpleCaretMovement(i) // i = U+01d0 is true
+PASS hasSimpleCaretMovement(i) // i = U+01d1 is true
+PASS hasSimpleCaretMovement(i) // i = U+01d2 is true
+PASS hasSimpleCaretMovement(i) // i = U+01d3 is true
+PASS hasSimpleCaretMovement(i) // i = U+01d4 is true
+PASS hasSimpleCaretMovement(i) // i = U+01d5 is true
+PASS hasSimpleCaretMovement(i) // i = U+01d6 is true
+PASS hasSimpleCaretMovement(i) // i = U+01d7 is true
+PASS hasSimpleCaretMovement(i) // i = U+01d8 is true
+PASS hasSimpleCaretMovement(i) // i = U+01d9 is true
+PASS hasSimpleCaretMovement(i) // i = U+01da is true
+PASS hasSimpleCaretMovement(i) // i = U+01db is true
+PASS hasSimpleCaretMovement(i) // i = U+01dc is true
+PASS hasSimpleCaretMovement(i) // i = U+01dd is true
+PASS hasSimpleCaretMovement(i) // i = U+01de is true
+PASS hasSimpleCaretMovement(i) // i = U+01df is true
+PASS hasSimpleCaretMovement(i) // i = U+01e0 is true
+PASS hasSimpleCaretMovement(i) // i = U+01e1 is true
+PASS hasSimpleCaretMovement(i) // i = U+01e2 is true
+PASS hasSimpleCaretMovement(i) // i = U+01e3 is true
+PASS hasSimpleCaretMovement(i) // i = U+01e4 is true
+PASS hasSimpleCaretMovement(i) // i = U+01e5 is true
+PASS hasSimpleCaretMovement(i) // i = U+01e6 is true
+PASS hasSimpleCaretMovement(i) // i = U+01e7 is true
+PASS hasSimpleCaretMovement(i) // i = U+01e8 is true
+PASS hasSimpleCaretMovement(i) // i = U+01e9 is true
+PASS hasSimpleCaretMovement(i) // i = U+01ea is true
+PASS hasSimpleCaretMovement(i) // i = U+01eb is true
+PASS hasSimpleCaretMovement(i) // i = U+01ec is true
+PASS hasSimpleCaretMovement(i) // i = U+01ed is true
+PASS hasSimpleCaretMovement(i) // i = U+01ee is true
+PASS hasSimpleCaretMovement(i) // i = U+01ef is true
+PASS hasSimpleCaretMovement(i) // i = U+01f0 is true
+PASS hasSimpleCaretMovement(i) // i = U+01f1 is true
+PASS hasSimpleCaretMovement(i) // i = U+01f2 is true
+PASS hasSimpleCaretMovement(i) // i = U+01f3 is true
+PASS hasSimpleCaretMovement(i) // i = U+01f4 is true
+PASS hasSimpleCaretMovement(i) // i = U+01f5 is true
+PASS hasSimpleCaretMovement(i) // i = U+01f6 is true
+PASS hasSimpleCaretMovement(i) // i = U+01f7 is true
+PASS hasSimpleCaretMovement(i) // i = U+01f8 is true
+PASS hasSimpleCaretMovement(i) // i = U+01f9 is true
+PASS hasSimpleCaretMovement(i) // i = U+01fa is true
+PASS hasSimpleCaretMovement(i) // i = U+01fb is true
+PASS hasSimpleCaretMovement(i) // i = U+01fc is true
+PASS hasSimpleCaretMovement(i) // i = U+01fd is true
+PASS hasSimpleCaretMovement(i) // i = U+01fe is true
+PASS hasSimpleCaretMovement(i) // i = U+01ff is true
+PASS hasSimpleCaretMovement(i) // i = U+0200 is true
+PASS hasSimpleCaretMovement(i) // i = U+0201 is true
+PASS hasSimpleCaretMovement(i) // i = U+0202 is true
+PASS hasSimpleCaretMovement(i) // i = U+0203 is true
+PASS hasSimpleCaretMovement(i) // i = U+0204 is true
+PASS hasSimpleCaretMovement(i) // i = U+0205 is true
+PASS hasSimpleCaretMovement(i) // i = U+0206 is true
+PASS hasSimpleCaretMovement(i) // i = U+0207 is true
+PASS hasSimpleCaretMovement(i) // i = U+0208 is true
+PASS hasSimpleCaretMovement(i) // i = U+0209 is true
+PASS hasSimpleCaretMovement(i) // i = U+020a is true
+PASS hasSimpleCaretMovement(i) // i = U+020b is true
+PASS hasSimpleCaretMovement(i) // i = U+020c is true
+PASS hasSimpleCaretMovement(i) // i = U+020d is true
+PASS hasSimpleCaretMovement(i) // i = U+020e is true
+PASS hasSimpleCaretMovement(i) // i = U+020f is true
+PASS hasSimpleCaretMovement(i) // i = U+0210 is true
+PASS hasSimpleCaretMovement(i) // i = U+0211 is true
+PASS hasSimpleCaretMovement(i) // i = U+0212 is true
+PASS hasSimpleCaretMovement(i) // i = U+0213 is true
+PASS hasSimpleCaretMovement(i) // i = U+0214 is true
+PASS hasSimpleCaretMovement(i) // i = U+0215 is true
+PASS hasSimpleCaretMovement(i) // i = U+0216 is true
+PASS hasSimpleCaretMovement(i) // i = U+0217 is true
+PASS hasSimpleCaretMovement(i) // i = U+0218 is true
+PASS hasSimpleCaretMovement(i) // i = U+0219 is true
+PASS hasSimpleCaretMovement(i) // i = U+021a is true
+PASS hasSimpleCaretMovement(i) // i = U+021b is true
+PASS hasSimpleCaretMovement(i) // i = U+021c is true
+PASS hasSimpleCaretMovement(i) // i = U+021d is true
+PASS hasSimpleCaretMovement(i) // i = U+021e is true
+PASS hasSimpleCaretMovement(i) // i = U+021f is true
+PASS hasSimpleCaretMovement(i) // i = U+0220 is true
+PASS hasSimpleCaretMovement(i) // i = U+0221 is true
+PASS hasSimpleCaretMovement(i) // i = U+0222 is true
+PASS hasSimpleCaretMovement(i) // i = U+0223 is true
+PASS hasSimpleCaretMovement(i) // i = U+0224 is true
+PASS hasSimpleCaretMovement(i) // i = U+0225 is true
+PASS hasSimpleCaretMovement(i) // i = U+0226 is true
+PASS hasSimpleCaretMovement(i) // i = U+0227 is true
+PASS hasSimpleCaretMovement(i) // i = U+0228 is true
+PASS hasSimpleCaretMovement(i) // i = U+0229 is true
+PASS hasSimpleCaretMovement(i) // i = U+022a is true
+PASS hasSimpleCaretMovement(i) // i = U+022b is true
+PASS hasSimpleCaretMovement(i) // i = U+022c is true
+PASS hasSimpleCaretMovement(i) // i = U+022d is true
+PASS hasSimpleCaretMovement(i) // i = U+022e is true
+PASS hasSimpleCaretMovement(i) // i = U+022f is true
+PASS hasSimpleCaretMovement(i) // i = U+0230 is true
+PASS hasSimpleCaretMovement(i) // i = U+0231 is true
+PASS hasSimpleCaretMovement(i) // i = U+0232 is true
+PASS hasSimpleCaretMovement(i) // i = U+0233 is true
+PASS hasSimpleCaretMovement(i) // i = U+0234 is true
+PASS hasSimpleCaretMovement(i) // i = U+0235 is true
+PASS hasSimpleCaretMovement(i) // i = U+0236 is true
+PASS hasSimpleCaretMovement(i) // i = U+0237 is true
+PASS hasSimpleCaretMovement(i) // i = U+0238 is true
+PASS hasSimpleCaretMovement(i) // i = U+0239 is true
+PASS hasSimpleCaretMovement(i) // i = U+023a is true
+PASS hasSimpleCaretMovement(i) // i = U+023b is true
+PASS hasSimpleCaretMovement(i) // i = U+023c is true
+PASS hasSimpleCaretMovement(i) // i = U+023d is true
+PASS hasSimpleCaretMovement(i) // i = U+023e is true
+PASS hasSimpleCaretMovement(i) // i = U+023f is true
+PASS hasSimpleCaretMovement(i) // i = U+0240 is true
+PASS hasSimpleCaretMovement(i) // i = U+0241 is true
+PASS hasSimpleCaretMovement(i) // i = U+0242 is true
+PASS hasSimpleCaretMovement(i) // i = U+0243 is true
+PASS hasSimpleCaretMovement(i) // i = U+0244 is true
+PASS hasSimpleCaretMovement(i) // i = U+0245 is true
+PASS hasSimpleCaretMovement(i) // i = U+0246 is true
+PASS hasSimpleCaretMovement(i) // i = U+0247 is true
+PASS hasSimpleCaretMovement(i) // i = U+0248 is true
+PASS hasSimpleCaretMovement(i) // i = U+0249 is true
+PASS hasSimpleCaretMovement(i) // i = U+024a is true
+PASS hasSimpleCaretMovement(i) // i = U+024b is true
+PASS hasSimpleCaretMovement(i) // i = U+024c is true
+PASS hasSimpleCaretMovement(i) // i = U+024d is true
+PASS hasSimpleCaretMovement(i) // i = U+024e is true
+PASS hasSimpleCaretMovement(i) // i = U+024f is true
+PASS hasSimpleCaretMovement(i) // i = U+0250 is true
+PASS hasSimpleCaretMovement(i) // i = U+0251 is true
+PASS hasSimpleCaretMovement(i) // i = U+0252 is true
+PASS hasSimpleCaretMovement(i) // i = U+0253 is true
+PASS hasSimpleCaretMovement(i) // i = U+0254 is true
+PASS hasSimpleCaretMovement(i) // i = U+0255 is true
+PASS hasSimpleCaretMovement(i) // i = U+0256 is true
+PASS hasSimpleCaretMovement(i) // i = U+0257 is true
+PASS hasSimpleCaretMovement(i) // i = U+0258 is true
+PASS hasSimpleCaretMovement(i) // i = U+0259 is true
+PASS hasSimpleCaretMovement(i) // i = U+025a is true
+PASS hasSimpleCaretMovement(i) // i = U+025b is true
+PASS hasSimpleCaretMovement(i) // i = U+025c is true
+PASS hasSimpleCaretMovement(i) // i = U+025d is true
+PASS hasSimpleCaretMovement(i) // i = U+025e is true
+PASS hasSimpleCaretMovement(i) // i = U+025f is true
+PASS hasSimpleCaretMovement(i) // i = U+0260 is true
+PASS hasSimpleCaretMovement(i) // i = U+0261 is true
+PASS hasSimpleCaretMovement(i) // i = U+0262 is true
+PASS hasSimpleCaretMovement(i) // i = U+0263 is true
+PASS hasSimpleCaretMovement(i) // i = U+0264 is true
+PASS hasSimpleCaretMovement(i) // i = U+0265 is true
+PASS hasSimpleCaretMovement(i) // i = U+0266 is true
+PASS hasSimpleCaretMovement(i) // i = U+0267 is true
+PASS hasSimpleCaretMovement(i) // i = U+0268 is true
+PASS hasSimpleCaretMovement(i) // i = U+0269 is true
+PASS hasSimpleCaretMovement(i) // i = U+026a is true
+PASS hasSimpleCaretMovement(i) // i = U+026b is true
+PASS hasSimpleCaretMovement(i) // i = U+026c is true
+PASS hasSimpleCaretMovement(i) // i = U+026d is true
+PASS hasSimpleCaretMovement(i) // i = U+026e is true
+PASS hasSimpleCaretMovement(i) // i = U+026f is true
+PASS hasSimpleCaretMovement(i) // i = U+0270 is true
+PASS hasSimpleCaretMovement(i) // i = U+0271 is true
+PASS hasSimpleCaretMovement(i) // i = U+0272 is true
+PASS hasSimpleCaretMovement(i) // i = U+0273 is true
+PASS hasSimpleCaretMovement(i) // i = U+0274 is true
+PASS hasSimpleCaretMovement(i) // i = U+0275 is true
+PASS hasSimpleCaretMovement(i) // i = U+0276 is true
+PASS hasSimpleCaretMovement(i) // i = U+0277 is true
+PASS hasSimpleCaretMovement(i) // i = U+0278 is true
+PASS hasSimpleCaretMovement(i) // i = U+0279 is true
+PASS hasSimpleCaretMovement(i) // i = U+027a is true
+PASS hasSimpleCaretMovement(i) // i = U+027b is true
+PASS hasSimpleCaretMovement(i) // i = U+027c is true
+PASS hasSimpleCaretMovement(i) // i = U+027d is true
+PASS hasSimpleCaretMovement(i) // i = U+027e is true
+PASS hasSimpleCaretMovement(i) // i = U+027f is true
+PASS hasSimpleCaretMovement(i) // i = U+0280 is true
+PASS hasSimpleCaretMovement(i) // i = U+0281 is true
+PASS hasSimpleCaretMovement(i) // i = U+0282 is true
+PASS hasSimpleCaretMovement(i) // i = U+0283 is true
+PASS hasSimpleCaretMovement(i) // i = U+0284 is true
+PASS hasSimpleCaretMovement(i) // i = U+0285 is true
+PASS hasSimpleCaretMovement(i) // i = U+0286 is true
+PASS hasSimpleCaretMovement(i) // i = U+0287 is true
+PASS hasSimpleCaretMovement(i) // i = U+0288 is true
+PASS hasSimpleCaretMovement(i) // i = U+0289 is true
+PASS hasSimpleCaretMovement(i) // i = U+028a is true
+PASS hasSimpleCaretMovement(i) // i = U+028b is true
+PASS hasSimpleCaretMovement(i) // i = U+028c is true
+PASS hasSimpleCaretMovement(i) // i = U+028d is true
+PASS hasSimpleCaretMovement(i) // i = U+028e is true
+PASS hasSimpleCaretMovement(i) // i = U+028f is true
+PASS hasSimpleCaretMovement(i) // i = U+0290 is true
+PASS hasSimpleCaretMovement(i) // i = U+0291 is true
+PASS hasSimpleCaretMovement(i) // i = U+0292 is true
+PASS hasSimpleCaretMovement(i) // i = U+0293 is true
+PASS hasSimpleCaretMovement(i) // i = U+0294 is true
+PASS hasSimpleCaretMovement(i) // i = U+0295 is true
+PASS hasSimpleCaretMovement(i) // i = U+0296 is true
+PASS hasSimpleCaretMovement(i) // i = U+0297 is true
+PASS hasSimpleCaretMovement(i) // i = U+0298 is true
+PASS hasSimpleCaretMovement(i) // i = U+0299 is true
+PASS hasSimpleCaretMovement(i) // i = U+029a is true
+PASS hasSimpleCaretMovement(i) // i = U+029b is true
+PASS hasSimpleCaretMovement(i) // i = U+029c is true
+PASS hasSimpleCaretMovement(i) // i = U+029d is true
+PASS hasSimpleCaretMovement(i) // i = U+029e is true
+PASS hasSimpleCaretMovement(i) // i = U+029f is true
+PASS hasSimpleCaretMovement(i) // i = U+02a0 is true
+PASS hasSimpleCaretMovement(i) // i = U+02a1 is true
+PASS hasSimpleCaretMovement(i) // i = U+02a2 is true
+PASS hasSimpleCaretMovement(i) // i = U+02a3 is true
+PASS hasSimpleCaretMovement(i) // i = U+02a4 is true
+PASS hasSimpleCaretMovement(i) // i = U+02a5 is true
+PASS hasSimpleCaretMovement(i) // i = U+02a6 is true
+PASS hasSimpleCaretMovement(i) // i = U+02a7 is true
+PASS hasSimpleCaretMovement(i) // i = U+02a8 is true
+PASS hasSimpleCaretMovement(i) // i = U+02a9 is true
+PASS hasSimpleCaretMovement(i) // i = U+02aa is true
+PASS hasSimpleCaretMovement(i) // i = U+02ab is true
+PASS hasSimpleCaretMovement(i) // i = U+02ac is true
+PASS hasSimpleCaretMovement(i) // i = U+02ad is true
+PASS hasSimpleCaretMovement(i) // i = U+02ae is true
+PASS hasSimpleCaretMovement(i) // i = U+02af is true
+PASS hasSimpleCaretMovement(i) // i = U+02b0 is true
+PASS hasSimpleCaretMovement(i) // i = U+02b1 is true
+PASS hasSimpleCaretMovement(i) // i = U+02b2 is true
+PASS hasSimpleCaretMovement(i) // i = U+02b3 is true
+PASS hasSimpleCaretMovement(i) // i = U+02b4 is true
+PASS hasSimpleCaretMovement(i) // i = U+02b5 is true
+PASS hasSimpleCaretMovement(i) // i = U+02b6 is true
+PASS hasSimpleCaretMovement(i) // i = U+02b7 is true
+PASS hasSimpleCaretMovement(i) // i = U+02b8 is true
+PASS hasSimpleCaretMovement(i) // i = U+02b9 is true
+PASS hasSimpleCaretMovement(i) // i = U+02ba is true
+PASS hasSimpleCaretMovement(i) // i = U+02bb is true
+PASS hasSimpleCaretMovement(i) // i = U+02bc is true
+PASS hasSimpleCaretMovement(i) // i = U+02bd is true
+PASS hasSimpleCaretMovement(i) // i = U+02be is true
+PASS hasSimpleCaretMovement(i) // i = U+02bf is true
+PASS hasSimpleCaretMovement(i) // i = U+02c0 is true
+PASS hasSimpleCaretMovement(i) // i = U+02c1 is true
+PASS hasSimpleCaretMovement(i) // i = U+02c2 is true
+PASS hasSimpleCaretMovement(i) // i = U+02c3 is true
+PASS hasSimpleCaretMovement(i) // i = U+02c4 is true
+PASS hasSimpleCaretMovement(i) // i = U+02c5 is true
+PASS hasSimpleCaretMovement(i) // i = U+02c6 is true
+PASS hasSimpleCaretMovement(i) // i = U+02c7 is true
+PASS hasSimpleCaretMovement(i) // i = U+02c8 is true
+PASS hasSimpleCaretMovement(i) // i = U+02c9 is true
+PASS hasSimpleCaretMovement(i) // i = U+02ca is true
+PASS hasSimpleCaretMovement(i) // i = U+02cb is true
+PASS hasSimpleCaretMovement(i) // i = U+02cc is true
+PASS hasSimpleCaretMovement(i) // i = U+02cd is true
+PASS hasSimpleCaretMovement(i) // i = U+02ce is true
+PASS hasSimpleCaretMovement(i) // i = U+02cf is true
+PASS hasSimpleCaretMovement(i) // i = U+02d0 is true
+PASS hasSimpleCaretMovement(i) // i = U+02d1 is true
+PASS hasSimpleCaretMovement(i) // i = U+02d2 is true
+PASS hasSimpleCaretMovement(i) // i = U+02d3 is true
+PASS hasSimpleCaretMovement(i) // i = U+02d4 is true
+PASS hasSimpleCaretMovement(i) // i = U+02d5 is true
+PASS hasSimpleCaretMovement(i) // i = U+02d6 is true
+PASS hasSimpleCaretMovement(i) // i = U+02d7 is true
+PASS hasSimpleCaretMovement(i) // i = U+02d8 is true
+PASS hasSimpleCaretMovement(i) // i = U+02d9 is true
+PASS hasSimpleCaretMovement(i) // i = U+02da is true
+PASS hasSimpleCaretMovement(i) // i = U+02db is true
+PASS hasSimpleCaretMovement(i) // i = U+02dc is true
+PASS hasSimpleCaretMovement(i) // i = U+02dd is true
+PASS hasSimpleCaretMovement(i) // i = U+02de is true
+PASS hasSimpleCaretMovement(i) // i = U+02df is true
+PASS hasSimpleCaretMovement(i) // i = U+02e0 is true
+PASS hasSimpleCaretMovement(i) // i = U+02e1 is true
+PASS hasSimpleCaretMovement(i) // i = U+02e2 is true
+PASS hasSimpleCaretMovement(i) // i = U+02e3 is true
+PASS hasSimpleCaretMovement(i) // i = U+02e4 is true
+PASS hasSimpleCaretMovement(i) // i = U+02e5 is true
+PASS hasSimpleCaretMovement(i) // i = U+02e6 is true
+PASS hasSimpleCaretMovement(i) // i = U+02e7 is true
+PASS hasSimpleCaretMovement(i) // i = U+02e8 is true
+PASS hasSimpleCaretMovement(i) // i = U+02e9 is true
+PASS hasSimpleCaretMovement(i) // i = U+02ea is true
+PASS hasSimpleCaretMovement(i) // i = U+02eb is true
+PASS hasSimpleCaretMovement(i) // i = U+02ec is true
+PASS hasSimpleCaretMovement(i) // i = U+02ed is true
+PASS hasSimpleCaretMovement(i) // i = U+02ee is true
+PASS hasSimpleCaretMovement(i) // i = U+02ef is true
+PASS hasSimpleCaretMovement(i) // i = U+02f0 is true
+PASS hasSimpleCaretMovement(i) // i = U+02f1 is true
+PASS hasSimpleCaretMovement(i) // i = U+02f2 is true
+PASS hasSimpleCaretMovement(i) // i = U+02f3 is true
+PASS hasSimpleCaretMovement(i) // i = U+02f4 is true
+PASS hasSimpleCaretMovement(i) // i = U+02f5 is true
+PASS hasSimpleCaretMovement(i) // i = U+02f6 is true
+PASS hasSimpleCaretMovement(i) // i = U+02f7 is true
+PASS hasSimpleCaretMovement(i) // i = U+02f8 is true
+PASS hasSimpleCaretMovement(i) // i = U+02f9 is true
+PASS hasSimpleCaretMovement(i) // i = U+02fa is true
+PASS hasSimpleCaretMovement(i) // i = U+02fb is true
+PASS hasSimpleCaretMovement(i) // i = U+02fc is true
+PASS hasSimpleCaretMovement(i) // i = U+02fd is true
+PASS hasSimpleCaretMovement(i) // i = U+02fe is true
+PASS hasSimpleCaretMovement(i) // i = U+02ff is true
+PASS hasSimpleCaretMovement(i) // i = U+0300 is false
+PASS hasSimpleCaretMovement(i) // i = U+0301 is false
+PASS hasSimpleCaretMovement(i) // i = U+0302 is false
+PASS hasSimpleCaretMovement(i) // i = U+0303 is false
+PASS hasSimpleCaretMovement(i) // i = U+0304 is false
+PASS hasSimpleCaretMovement(i) // i = U+0305 is false
+PASS hasSimpleCaretMovement(i) // i = U+0306 is false
+PASS hasSimpleCaretMovement(i) // i = U+0307 is false
+PASS hasSimpleCaretMovement(i) // i = U+0308 is false
+PASS hasSimpleCaretMovement(i) // i = U+0309 is false
+PASS hasSimpleCaretMovement(i) // i = U+030a is false
+PASS hasSimpleCaretMovement(i) // i = U+030b is false
+PASS hasSimpleCaretMovement(i) // i = U+030c is false
+PASS hasSimpleCaretMovement(i) // i = U+030d is false
+PASS hasSimpleCaretMovement(i) // i = U+030e is false
+PASS hasSimpleCaretMovement(i) // i = U+030f is false
+PASS hasSimpleCaretMovement(i) // i = U+0310 is false
+PASS hasSimpleCaretMovement(i) // i = U+0311 is false
+PASS hasSimpleCaretMovement(i) // i = U+0312 is false
+PASS hasSimpleCaretMovement(i) // i = U+0313 is false
+PASS hasSimpleCaretMovement(i) // i = U+0314 is false
+PASS hasSimpleCaretMovement(i) // i = U+0315 is false
+PASS hasSimpleCaretMovement(i) // i = U+0316 is false
+PASS hasSimpleCaretMovement(i) // i = U+0317 is false
+PASS hasSimpleCaretMovement(i) // i = U+0318 is false
+PASS hasSimpleCaretMovement(i) // i = U+0319 is false
+PASS hasSimpleCaretMovement(i) // i = U+031a is false
+PASS hasSimpleCaretMovement(i) // i = U+031b is false
+PASS hasSimpleCaretMovement(i) // i = U+031c is false
+PASS hasSimpleCaretMovement(i) // i = U+031d is false
+PASS hasSimpleCaretMovement(i) // i = U+031e is false
+PASS hasSimpleCaretMovement(i) // i = U+031f is false
+PASS hasSimpleCaretMovement(i) // i = U+0320 is false
+PASS hasSimpleCaretMovement(i) // i = U+0321 is false
+PASS hasSimpleCaretMovement(i) // i = U+0322 is false
+PASS hasSimpleCaretMovement(i) // i = U+0323 is false
+PASS hasSimpleCaretMovement(i) // i = U+0324 is false
+PASS hasSimpleCaretMovement(i) // i = U+0325 is false
+PASS hasSimpleCaretMovement(i) // i = U+0326 is false
+PASS hasSimpleCaretMovement(i) // i = U+0327 is false
+PASS hasSimpleCaretMovement(i) // i = U+0328 is false
+PASS hasSimpleCaretMovement(i) // i = U+0329 is false
+PASS hasSimpleCaretMovement(i) // i = U+032a is false
+PASS hasSimpleCaretMovement(i) // i = U+032b is false
+PASS hasSimpleCaretMovement(i) // i = U+032c is false
+PASS hasSimpleCaretMovement(i) // i = U+032d is false
+PASS hasSimpleCaretMovement(i) // i = U+032e is false
+PASS hasSimpleCaretMovement(i) // i = U+032f is false
+PASS hasSimpleCaretMovement(i) // i = U+0330 is false
+PASS hasSimpleCaretMovement(i) // i = U+0331 is false
+PASS hasSimpleCaretMovement(i) // i = U+0332 is false
+PASS hasSimpleCaretMovement(i) // i = U+0333 is false
+PASS hasSimpleCaretMovement(i) // i = U+0334 is false
+PASS hasSimpleCaretMovement(i) // i = U+0335 is false
+PASS hasSimpleCaretMovement(i) // i = U+0336 is false
+PASS hasSimpleCaretMovement(i) // i = U+0337 is false
+PASS hasSimpleCaretMovement(i) // i = U+0338 is false
+PASS hasSimpleCaretMovement(i) // i = U+0339 is false
+PASS hasSimpleCaretMovement(i) // i = U+033a is false
+PASS hasSimpleCaretMovement(i) // i = U+033b is false
+PASS hasSimpleCaretMovement(i) // i = U+033c is false
+PASS hasSimpleCaretMovement(i) // i = U+033d is false
+PASS hasSimpleCaretMovement(i) // i = U+033e is false
+PASS hasSimpleCaretMovement(i) // i = U+033f is false
+PASS hasSimpleCaretMovement(i) // i = U+0340 is false
+PASS hasSimpleCaretMovement(i) // i = U+0341 is false
+PASS hasSimpleCaretMovement(i) // i = U+0342 is false
+PASS hasSimpleCaretMovement(i) // i = U+0343 is false
+PASS hasSimpleCaretMovement(i) // i = U+0344 is false
+PASS hasSimpleCaretMovement(i) // i = U+0345 is false
+PASS hasSimpleCaretMovement(i) // i = U+0346 is false
+PASS hasSimpleCaretMovement(i) // i = U+0347 is false
+PASS hasSimpleCaretMovement(i) // i = U+0348 is false
+PASS hasSimpleCaretMovement(i) // i = U+0349 is false
+PASS hasSimpleCaretMovement(i) // i = U+034a is false
+PASS hasSimpleCaretMovement(i) // i = U+034b is false
+PASS hasSimpleCaretMovement(i) // i = U+034c is false
+PASS hasSimpleCaretMovement(i) // i = U+034d is false
+PASS hasSimpleCaretMovement(i) // i = U+034e is false
+PASS hasSimpleCaretMovement(i) // i = U+034f is false
+PASS hasSimpleCaretMovement(i) // i = U+0350 is false
+PASS hasSimpleCaretMovement(i) // i = U+0351 is false
+PASS hasSimpleCaretMovement(i) // i = U+0352 is false
+PASS hasSimpleCaretMovement(i) // i = U+0353 is false
+PASS hasSimpleCaretMovement(i) // i = U+0354 is false
+PASS hasSimpleCaretMovement(i) // i = U+0355 is false
+PASS hasSimpleCaretMovement(i) // i = U+0356 is false
+PASS hasSimpleCaretMovement(i) // i = U+0357 is false
+PASS hasSimpleCaretMovement(i) // i = U+0358 is false
+PASS hasSimpleCaretMovement(i) // i = U+0359 is false
+PASS hasSimpleCaretMovement(i) // i = U+035a is false
+PASS hasSimpleCaretMovement(i) // i = U+035b is false
+PASS hasSimpleCaretMovement(i) // i = U+035c is false
+PASS hasSimpleCaretMovement(i) // i = U+035d is false
+PASS hasSimpleCaretMovement(i) // i = U+035e is false
+PASS hasSimpleCaretMovement(i) // i = U+035f is false
+PASS hasSimpleCaretMovement(i) // i = U+0360 is false
+PASS hasSimpleCaretMovement(i) // i = U+0361 is false
+PASS hasSimpleCaretMovement(i) // i = U+0362 is false
+PASS hasSimpleCaretMovement(i) // i = U+0363 is false
+PASS hasSimpleCaretMovement(i) // i = U+0364 is false
+PASS hasSimpleCaretMovement(i) // i = U+0365 is false
+PASS hasSimpleCaretMovement(i) // i = U+0366 is false
+PASS hasSimpleCaretMovement(i) // i = U+0367 is false
+PASS hasSimpleCaretMovement(i) // i = U+0368 is false
+PASS hasSimpleCaretMovement(i) // i = U+0369 is false
+PASS hasSimpleCaretMovement(i) // i = U+036a is false
+PASS hasSimpleCaretMovement(i) // i = U+036b is false
+PASS hasSimpleCaretMovement(i) // i = U+036c is false
+PASS hasSimpleCaretMovement(i) // i = U+036d is false
+PASS hasSimpleCaretMovement(i) // i = U+036e is false
+PASS hasSimpleCaretMovement(i) // i = U+036f is false
+PASS hasSimpleCaretMovement(i) // i = U+0370 is true
+PASS hasSimpleCaretMovement(i) // i = U+0371 is true
+PASS hasSimpleCaretMovement(i) // i = U+0372 is true
+PASS hasSimpleCaretMovement(i) // i = U+0373 is true
+PASS hasSimpleCaretMovement(i) // i = U+0374 is true
+PASS hasSimpleCaretMovement(i) // i = U+0375 is true
+PASS hasSimpleCaretMovement(i) // i = U+0376 is true
+PASS hasSimpleCaretMovement(i) // i = U+0377 is true
+PASS hasSimpleCaretMovement(i) // i = U+0378 is true
+PASS hasSimpleCaretMovement(i) // i = U+0379 is true
+PASS hasSimpleCaretMovement(i) // i = U+037a is true
+PASS hasSimpleCaretMovement(i) // i = U+037b is true
+PASS hasSimpleCaretMovement(i) // i = U+037c is true
+PASS hasSimpleCaretMovement(i) // i = U+037d is true
+PASS hasSimpleCaretMovement(i) // i = U+037e is true
+PASS hasSimpleCaretMovement(i) // i = U+037f is true
+PASS hasSimpleCaretMovement(i) // i = U+0380 is true
+PASS hasSimpleCaretMovement(i) // i = U+0381 is true
+PASS hasSimpleCaretMovement(i) // i = U+0382 is true
+PASS hasSimpleCaretMovement(i) // i = U+0383 is true
+PASS hasSimpleCaretMovement(i) // i = U+0384 is true
+PASS hasSimpleCaretMovement(i) // i = U+0385 is true
+PASS hasSimpleCaretMovement(i) // i = U+0386 is true
+PASS hasSimpleCaretMovement(i) // i = U+0387 is true
+PASS hasSimpleCaretMovement(i) // i = U+0388 is true
+PASS hasSimpleCaretMovement(i) // i = U+0389 is true
+PASS hasSimpleCaretMovement(i) // i = U+038a is true
+PASS hasSimpleCaretMovement(i) // i = U+038b is true
+PASS hasSimpleCaretMovement(i) // i = U+038c is true
+PASS hasSimpleCaretMovement(i) // i = U+038d is true
+PASS hasSimpleCaretMovement(i) // i = U+038e is true
+PASS hasSimpleCaretMovement(i) // i = U+038f is true
+PASS hasSimpleCaretMovement(i) // i = U+0390 is true
+PASS hasSimpleCaretMovement(i) // i = U+0391 is true
+PASS hasSimpleCaretMovement(i) // i = U+0392 is true
+PASS hasSimpleCaretMovement(i) // i = U+0393 is true
+PASS hasSimpleCaretMovement(i) // i = U+0394 is true
+PASS hasSimpleCaretMovement(i) // i = U+0395 is true
+PASS hasSimpleCaretMovement(i) // i = U+0396 is true
+PASS hasSimpleCaretMovement(i) // i = U+0397 is true
+PASS hasSimpleCaretMovement(i) // i = U+0398 is true
+PASS hasSimpleCaretMovement(i) // i = U+0399 is true
+PASS hasSimpleCaretMovement(i) // i = U+039a is true
+PASS hasSimpleCaretMovement(i) // i = U+039b is true
+PASS hasSimpleCaretMovement(i) // i = U+039c is true
+PASS hasSimpleCaretMovement(i) // i = U+039d is true
+PASS hasSimpleCaretMovement(i) // i = U+039e is true
+PASS hasSimpleCaretMovement(i) // i = U+039f is true
+PASS hasSimpleCaretMovement(i) // i = U+03a0 is true
+PASS hasSimpleCaretMovement(i) // i = U+03a1 is true
+PASS hasSimpleCaretMovement(i) // i = U+03a2 is true
+PASS hasSimpleCaretMovement(i) // i = U+03a3 is true
+PASS hasSimpleCaretMovement(i) // i = U+03a4 is true
+PASS hasSimpleCaretMovement(i) // i = U+03a5 is true
+PASS hasSimpleCaretMovement(i) // i = U+03a6 is true
+PASS hasSimpleCaretMovement(i) // i = U+03a7 is true
+PASS hasSimpleCaretMovement(i) // i = U+03a8 is true
+PASS hasSimpleCaretMovement(i) // i = U+03a9 is true
+PASS hasSimpleCaretMovement(i) // i = U+03aa is true
+PASS hasSimpleCaretMovement(i) // i = U+03ab is true
+PASS hasSimpleCaretMovement(i) // i = U+03ac is true
+PASS hasSimpleCaretMovement(i) // i = U+03ad is true
+PASS hasSimpleCaretMovement(i) // i = U+03ae is true
+PASS hasSimpleCaretMovement(i) // i = U+03af is true
+PASS hasSimpleCaretMovement(i) // i = U+03b0 is true
+PASS hasSimpleCaretMovement(i) // i = U+03b1 is true
+PASS hasSimpleCaretMovement(i) // i = U+03b2 is true
+PASS hasSimpleCaretMovement(i) // i = U+03b3 is true
+PASS hasSimpleCaretMovement(i) // i = U+03b4 is true
+PASS hasSimpleCaretMovement(i) // i = U+03b5 is true
+PASS hasSimpleCaretMovement(i) // i = U+03b6 is true
+PASS hasSimpleCaretMovement(i) // i = U+03b7 is true
+PASS hasSimpleCaretMovement(i) // i = U+03b8 is true
+PASS hasSimpleCaretMovement(i) // i = U+03b9 is true
+PASS hasSimpleCaretMovement(i) // i = U+03ba is true
+PASS hasSimpleCaretMovement(i) // i = U+03bb is true
+PASS hasSimpleCaretMovement(i) // i = U+03bc is true
+PASS hasSimpleCaretMovement(i) // i = U+03bd is true
+PASS hasSimpleCaretMovement(i) // i = U+03be is true
+PASS hasSimpleCaretMovement(i) // i = U+03bf is true
+PASS hasSimpleCaretMovement(i) // i = U+03c0 is true
+PASS hasSimpleCaretMovement(i) // i = U+03c1 is true
+PASS hasSimpleCaretMovement(i) // i = U+03c2 is true
+PASS hasSimpleCaretMovement(i) // i = U+03c3 is true
+PASS hasSimpleCaretMovement(i) // i = U+03c4 is true
+PASS hasSimpleCaretMovement(i) // i = U+03c5 is true
+PASS hasSimpleCaretMovement(i) // i = U+03c6 is true
+PASS hasSimpleCaretMovement(i) // i = U+03c7 is true
+PASS hasSimpleCaretMovement(i) // i = U+03c8 is true
+PASS hasSimpleCaretMovement(i) // i = U+03c9 is true
+PASS hasSimpleCaretMovement(i) // i = U+03ca is true
+PASS hasSimpleCaretMovement(i) // i = U+03cb is true
+PASS hasSimpleCaretMovement(i) // i = U+03cc is true
+PASS hasSimpleCaretMovement(i) // i = U+03cd is true
+PASS hasSimpleCaretMovement(i) // i = U+03ce is true
+PASS hasSimpleCaretMovement(i) // i = U+03cf is true
+PASS hasSimpleCaretMovement(i) // i = U+03d0 is true
+PASS hasSimpleCaretMovement(i) // i = U+03d1 is true
+PASS hasSimpleCaretMovement(i) // i = U+03d2 is true
+PASS hasSimpleCaretMovement(i) // i = U+03d3 is true
+PASS hasSimpleCaretMovement(i) // i = U+03d4 is true
+PASS hasSimpleCaretMovement(i) // i = U+03d5 is true
+PASS hasSimpleCaretMovement(i) // i = U+03d6 is true
+PASS hasSimpleCaretMovement(i) // i = U+03d7 is true
+PASS hasSimpleCaretMovement(i) // i = U+03d8 is true
+PASS hasSimpleCaretMovement(i) // i = U+03d9 is true
+PASS hasSimpleCaretMovement(i) // i = U+03da is true
+PASS hasSimpleCaretMovement(i) // i = U+03db is true
+PASS hasSimpleCaretMovement(i) // i = U+03dc is true
+PASS hasSimpleCaretMovement(i) // i = U+03dd is true
+PASS hasSimpleCaretMovement(i) // i = U+03de is true
+PASS hasSimpleCaretMovement(i) // i = U+03df is true
+PASS hasSimpleCaretMovement(i) // i = U+03e0 is true
+PASS hasSimpleCaretMovement(i) // i = U+03e1 is true
+PASS hasSimpleCaretMovement(i) // i = U+03e2 is true
+PASS hasSimpleCaretMovement(i) // i = U+03e3 is true
+PASS hasSimpleCaretMovement(i) // i = U+03e4 is true
+PASS hasSimpleCaretMovement(i) // i = U+03e5 is true
+PASS hasSimpleCaretMovement(i) // i = U+03e6 is true
+PASS hasSimpleCaretMovement(i) // i = U+03e7 is true
+PASS hasSimpleCaretMovement(i) // i = U+03e8 is true
+PASS hasSimpleCaretMovement(i) // i = U+03e9 is true
+PASS hasSimpleCaretMovement(i) // i = U+03ea is true
+PASS hasSimpleCaretMovement(i) // i = U+03eb is true
+PASS hasSimpleCaretMovement(i) // i = U+03ec is true
+PASS hasSimpleCaretMovement(i) // i = U+03ed is true
+PASS hasSimpleCaretMovement(i) // i = U+03ee is true
+PASS hasSimpleCaretMovement(i) // i = U+03ef is true
+PASS hasSimpleCaretMovement(i) // i = U+03f0 is true
+PASS hasSimpleCaretMovement(i) // i = U+03f1 is true
+PASS hasSimpleCaretMovement(i) // i = U+03f2 is true
+PASS hasSimpleCaretMovement(i) // i = U+03f3 is true
+PASS hasSimpleCaretMovement(i) // i = U+03f4 is true
+PASS hasSimpleCaretMovement(i) // i = U+03f5 is true
+PASS hasSimpleCaretMovement(i) // i = U+03f6 is true
+PASS hasSimpleCaretMovement(i) // i = U+03f7 is true
+PASS hasSimpleCaretMovement(i) // i = U+03f8 is true
+PASS hasSimpleCaretMovement(i) // i = U+03f9 is true
+PASS hasSimpleCaretMovement(i) // i = U+03fa is true
+PASS hasSimpleCaretMovement(i) // i = U+03fb is true
+PASS hasSimpleCaretMovement(i) // i = U+03fc is true
+PASS hasSimpleCaretMovement(i) // i = U+03fd is true
+PASS hasSimpleCaretMovement(i) // i = U+03fe is true
+PASS hasSimpleCaretMovement(i) // i = U+03ff is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/editing/selection/move-by-character-brute-force.html b/LayoutTests/editing/selection/move-by-character-brute-force.html
new file mode 100644 (file)
index 0000000..1f80226
--- /dev/null
@@ -0,0 +1,47 @@
+<meta charset="UTF-8">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+<div id="test"></div>
+<script>
+description("This test checks that we have simple caret motion up to a certain limit");
+
+function hasSimpleCaretMovement(charCode) {
+    var testString = "aaaaa" + String.fromCharCode(charCode) + "bbbb";
+    element.textContent = testString;
+    var selection = window.getSelection();
+    selection.setPosition(element, 0);
+    for (var i = 0; i < testString.length; ++i) {
+        selection.modify("move", "forward", "character");
+        if (selection.baseOffset != i + 1)
+            return false;
+    }
+    return true;
+}
+
+function toHex(i) {
+    var hex = i.toString(16);
+    while (hex.length < 4)
+        hex = "0" + hex;
+    return hex;
+}
+
+var element = document.getElementById("test");
+
+debug("Positive control:");
+shouldBeTrue("hasSimpleCaretMovement(0x0041)");
+debug("");
+
+debug("Negative control:");
+shouldBeFalse("hasSimpleCaretMovement(0x0300)");
+debug("");
+
+debug("Brute force:");
+for (var i = 1; i < 1024; ++i) {
+    if (i >= 0x0300 && i <= 0x036F)
+        shouldBeFalse("hasSimpleCaretMovement(i) // i = U+" + toHex(i));
+    else
+        shouldBeTrue("hasSimpleCaretMovement(i) // i = U+" + toHex(i));
+}
+
+element.textContent = "";
+</script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
index 32b5d18..4e69f35 100644 (file)
@@ -1,3 +1,24 @@
+2013-05-29  Adam Barth  <abarth@webkit.org>
+
+        Optimize RenderText::offsetNext for 8 bit strings
+        https://bugs.webkit.org/show_bug.cgi?id=116877
+
+        Reviewed by Darin Adler.
+
+        Previously, this function was always upconverting strings to 16 bits in
+        order to create a cursorMovementIterator. This patch adds a fast path
+        for ASCII and Latin-1 strings, which don't need this complicated cursor
+        movement logic.
+
+        I ran into this code because nextOffset showed up as a memory pig on a
+        memory profile of Mobile Gmail.
+
+        Test: editing/selection/move-by-character-brute-force.html
+
+        * rendering/RenderText.cpp:
+        (WebCore::RenderText::previousOffset):
+        (WebCore::RenderText::nextOffset):
+
 2013-05-29  Brent Fulgham  <bfulgham@apple.com>
 
         [Windows] Correct copy command (form versus forms)
index 4961bc2..e533380 100644 (file)
@@ -1725,8 +1725,11 @@ unsigned RenderText::renderedTextLength() const
 
 int RenderText::previousOffset(int current) const
 {
-    StringImpl* si = m_text.impl();
-    TextBreakIterator* iterator = cursorMovementIterator(si->characters(), si->length());
+    if (isAllASCII() || m_text.is8Bit())
+        return current - 1;
+
+    StringImpl* textImpl = m_text.impl();
+    TextBreakIterator* iterator = cursorMovementIterator(textImpl->characters16(), textImpl->length());
     if (!iterator)
         return current - 1;
 
@@ -1878,8 +1881,11 @@ int RenderText::previousOffsetForBackwardDeletion(int current) const
 
 int RenderText::nextOffset(int current) const
 {
-    StringImpl* si = m_text.impl();
-    TextBreakIterator* iterator = cursorMovementIterator(si->characters(), si->length());
+    if (isAllASCII() || m_text.is8Bit())
+        return current + 1;
+
+    StringImpl* textImpl = m_text.impl();
+    TextBreakIterator* iterator = cursorMovementIterator(textImpl->characters16(), textImpl->length());
     if (!iterator)
         return current + 1;
 
@@ -1887,7 +1893,6 @@ int RenderText::nextOffset(int current) const
     if (result == TextBreakDone)
         result = current + 1;
 
-
     return result;
 }