1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.org
8ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "SkRandom.h"
9b00cd7258c5ccf856c0dc72840e082306251b278reed@android.com#include "SkRefCnt.h"
10ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "SkTSearch.h"
11ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "SkTSort.h"
12ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "SkUtils.h"
138f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h"
14ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
15b00cd7258c5ccf856c0dc72840e082306251b278reed@android.comclass RefClass : public SkRefCnt {
16b00cd7258c5ccf856c0dc72840e082306251b278reed@android.compublic:
17a22e2117e44efa4298dd0eb6df304a8166c8e9c3robertphillips@google.com    SK_DECLARE_INST_COUNT(RefClass)
18a22e2117e44efa4298dd0eb6df304a8166c8e9c3robertphillips@google.com
19b00cd7258c5ccf856c0dc72840e082306251b278reed@android.com    RefClass(int n) : fN(n) {}
20b00cd7258c5ccf856c0dc72840e082306251b278reed@android.com    int get() const { return fN; }
21b00cd7258c5ccf856c0dc72840e082306251b278reed@android.com
22b00cd7258c5ccf856c0dc72840e082306251b278reed@android.comprivate:
23b00cd7258c5ccf856c0dc72840e082306251b278reed@android.com    int fN;
24a22e2117e44efa4298dd0eb6df304a8166c8e9c3robertphillips@google.com
25a22e2117e44efa4298dd0eb6df304a8166c8e9c3robertphillips@google.com    typedef SkRefCnt INHERITED;
26b00cd7258c5ccf856c0dc72840e082306251b278reed@android.com};
27b00cd7258c5ccf856c0dc72840e082306251b278reed@android.com
28a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.comstatic void test_autounref(skiatest::Reporter* reporter) {
29a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    RefClass obj(0);
30a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    REPORTER_ASSERT(reporter, 1 == obj.getRefCnt());
31a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com
32a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    SkAutoTUnref<RefClass> tmp(&obj);
33a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    REPORTER_ASSERT(reporter, &obj == tmp.get());
34a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    REPORTER_ASSERT(reporter, 1 == obj.getRefCnt());
35a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com
36a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    REPORTER_ASSERT(reporter, &obj == tmp.detach());
37a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    REPORTER_ASSERT(reporter, 1 == obj.getRefCnt());
38a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    REPORTER_ASSERT(reporter, NULL == tmp.detach());
39a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    REPORTER_ASSERT(reporter, NULL == tmp.get());
40a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com
41a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    obj.ref();
42a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    REPORTER_ASSERT(reporter, 2 == obj.getRefCnt());
43a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    {
44a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com        SkAutoTUnref<RefClass> tmp2(&obj);
45a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    }
46a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    REPORTER_ASSERT(reporter, 1 == obj.getRefCnt());
47a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com}
48a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com
494d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.comstatic void test_autostarray(skiatest::Reporter* reporter) {
504d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    RefClass obj0(0);
514d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    RefClass obj1(1);
524d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    REPORTER_ASSERT(reporter, 1 == obj0.getRefCnt());
534d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    REPORTER_ASSERT(reporter, 1 == obj1.getRefCnt());
544d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com
554d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    {
564d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        SkAutoSTArray<2, SkRefPtr<RefClass> > tmp;
574d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 0 == tmp.count());
584d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com
594d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp.reset(0);   // test out reset(0) when already at 0
604d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp.reset(4);   // this should force a new allocation
614d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 4 == tmp.count());
624d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp[0] = &obj0;
634d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp[1] = &obj1;
644d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 2 == obj0.getRefCnt());
654d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 2 == obj1.getRefCnt());
664d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com
674d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        // test out reset with data in the array (and a new allocation)
684d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp.reset(0);
694d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 0 == tmp.count());
704d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 1 == obj0.getRefCnt());
714d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 1 == obj1.getRefCnt());
729c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com
734d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp.reset(2);   // this should use the preexisting allocation
744d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 2 == tmp.count());
754d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp[0] = &obj0;
764d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp[1] = &obj1;
774d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    }
784d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com
794d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    // test out destructor with data in the array (and using existing allocation)
804d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    REPORTER_ASSERT(reporter, 1 == obj0.getRefCnt());
814d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    REPORTER_ASSERT(reporter, 1 == obj1.getRefCnt());
824d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com
834d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    {
844d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        // test out allocating ctor (this should allocate new memory)
854d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        SkAutoSTArray<2, SkRefPtr<RefClass> > tmp(4);
864d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 4 == tmp.count());
874d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com
884d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp[0] = &obj0;
894d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp[1] = &obj1;
904d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 2 == obj0.getRefCnt());
914d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 2 == obj1.getRefCnt());
924d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com
934d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        // Test out resut with data in the array and malloced storage
944d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp.reset(0);
954d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 1 == obj0.getRefCnt());
964d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 1 == obj1.getRefCnt());
974d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com
984d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp.reset(2);   // this should use the preexisting storage
994d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp[0] = &obj0;
1004d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp[1] = &obj1;
1014d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 2 == obj0.getRefCnt());
1024d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 2 == obj1.getRefCnt());
1034d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com
1044d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp.reset(4);   // this should force a new malloc
1054d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 1 == obj0.getRefCnt());
1064d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 1 == obj1.getRefCnt());
1074d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com
1084d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp[0] = &obj0;
1094d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        tmp[1] = &obj1;
1104d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 2 == obj0.getRefCnt());
1114d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com        REPORTER_ASSERT(reporter, 2 == obj1.getRefCnt());
1124d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    }
1134d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com
1144d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    REPORTER_ASSERT(reporter, 1 == obj0.getRefCnt());
1154d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    REPORTER_ASSERT(reporter, 1 == obj1.getRefCnt());
1164d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com}
1174d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com
118bcc56836ea31583bdf593d3c8c069efa0f43139depoger@google.com/////////////////////////////////////////////////////////////////////////////
119b00cd7258c5ccf856c0dc72840e082306251b278reed@android.com
120ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#define kSEARCH_COUNT   91
121ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
122ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comstatic void test_search(skiatest::Reporter* reporter) {
123ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    int         i, array[kSEARCH_COUNT];
124e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom    rand;
125ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
126ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    for (i = 0; i < kSEARCH_COUNT; i++) {
127ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        array[i] = rand.nextS();
128ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
129ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
130ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    SkTHeapSort<int>(array, kSEARCH_COUNT);
131ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    // make sure we got sorted properly
132ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    for (i = 1; i < kSEARCH_COUNT; i++) {
133ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        REPORTER_ASSERT(reporter, array[i-1] <= array[i]);
134ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
135ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
136ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    // make sure we can find all of our values
137ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    for (i = 0; i < kSEARCH_COUNT; i++) {
138ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        int index = SkTSearch<int>(array, kSEARCH_COUNT, array[i], sizeof(int));
139ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        REPORTER_ASSERT(reporter, index == i);
140ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
141ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
142ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    // make sure that random values are either found, or the correct
143ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    // insertion index is returned
144ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    for (i = 0; i < 10000; i++) {
145ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        int value = rand.nextS();
146ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        int index = SkTSearch<int>(array, kSEARCH_COUNT, value, sizeof(int));
147ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
148ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        if (index >= 0) {
149ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            REPORTER_ASSERT(reporter,
150ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com                            index < kSEARCH_COUNT && array[index] == value);
151ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        } else {
152ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            index = ~index;
153ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            REPORTER_ASSERT(reporter, index <= kSEARCH_COUNT);
154ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            if (index < kSEARCH_COUNT) {
155ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com                REPORTER_ASSERT(reporter, value < array[index]);
156ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com                if (index > 0) {
157ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com                    REPORTER_ASSERT(reporter, value > array[index - 1]);
158ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com                }
159ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            } else {
160ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com                // we should append the new value
161ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com                REPORTER_ASSERT(reporter, value > array[kSEARCH_COUNT - 1]);
162ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com            }
163ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        }
164ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
165ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com}
166ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
167ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comstatic void test_utf16(skiatest::Reporter* reporter) {
168ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    static const SkUnichar gUni[] = {
169ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        0x10000, 0x18080, 0x20202, 0xFFFFF, 0x101234
170ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    };
17180e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
172ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    uint16_t buf[2];
17380e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
174ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gUni); i++) {
175ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        size_t count = SkUTF16_FromUnichar(gUni[i], buf);
176ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        REPORTER_ASSERT(reporter, count == 2);
177ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        size_t count2 = SkUTF16_CountUnichars(buf, 2);
178ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        REPORTER_ASSERT(reporter, count2 == 1);
179ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        const uint16_t* ptr = buf;
180ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        SkUnichar c = SkUTF16_NextUnichar(&ptr);
181ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        REPORTER_ASSERT(reporter, c == gUni[i]);
182ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        REPORTER_ASSERT(reporter, ptr - buf == 2);
183ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
184ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com}
185ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
186e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(Utils, reporter) {
187ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    static const struct {
188ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        const char* fUtf8;
189ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        SkUnichar   fUni;
190ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    } gTest[] = {
191ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        { "a",                  'a' },
192ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        { "\x7f",               0x7f },
193ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        { "\xC2\x80",           0x80 },
194ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        { "\xC3\x83",           (3 << 6) | 3    },
195ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        { "\xDF\xBF",           0x7ff },
196ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        { "\xE0\xA0\x80",       0x800 },
197ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        { "\xE0\xB0\xB8",       0xC38 },
198ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        { "\xE3\x83\x83",       (3 << 12) | (3 << 6) | 3    },
199ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        { "\xEF\xBF\xBF",       0xFFFF },
200ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        { "\xF0\x90\x80\x80",   0x10000 },
201ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        { "\xF3\x83\x83\x83",   (3 << 18) | (3 << 12) | (3 << 6) | 3    }
202ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    };
203ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
204ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gTest); i++) {
205ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        const char* p = gTest[i].fUtf8;
206ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        int         n = SkUTF8_CountUnichars(p);
207ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        SkUnichar   u0 = SkUTF8_ToUnichar(gTest[i].fUtf8);
208ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        SkUnichar   u1 = SkUTF8_NextUnichar(&p);
209ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com
210ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        REPORTER_ASSERT(reporter, n == 1);
211ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        REPORTER_ASSERT(reporter, u0 == u1);
212ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        REPORTER_ASSERT(reporter, u0 == gTest[i].fUni);
213ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com        REPORTER_ASSERT(reporter,
214ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com                        p - gTest[i].fUtf8 == (int)strlen(gTest[i].fUtf8));
215ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    }
21680e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com
217ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    test_utf16(reporter);
218ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com    test_search(reporter);
219a67573e25faa81ea65e6fc368f66d3f0c0a5f189reed@google.com    test_autounref(reporter);
2204d3767373942c55be893d3bbbfe35e1975c2e1b4robertphillips@google.com    test_autostarray(reporter);
221ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com}
222