blob: 1c2f870d1fdeb6d66a8780f2f458151d54b1a1b6 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
reed@android.comed673312009-02-27 16:24:51 +00008#include "Test.h"
9#include "SkRandom.h"
reed@android.comb00cd722010-04-16 20:35:47 +000010#include "SkRefCnt.h"
reed@android.comed673312009-02-27 16:24:51 +000011#include "SkTSearch.h"
12#include "SkTSort.h"
13#include "SkUtils.h"
14
reed@android.comb00cd722010-04-16 20:35:47 +000015class RefClass : public SkRefCnt {
16public:
robertphillips@google.coma22e2112012-08-16 14:58:06 +000017 SK_DECLARE_INST_COUNT(RefClass)
18
reed@android.comb00cd722010-04-16 20:35:47 +000019 RefClass(int n) : fN(n) {}
20 int get() const { return fN; }
21
22private:
23 int fN;
robertphillips@google.coma22e2112012-08-16 14:58:06 +000024
25 typedef SkRefCnt INHERITED;
reed@android.comb00cd722010-04-16 20:35:47 +000026};
27
robertphillips@google.coma22e2112012-08-16 14:58:06 +000028SK_DEFINE_INST_COUNT(RefClass)
29
reed@android.comb00cd722010-04-16 20:35:47 +000030static void test_refptr(skiatest::Reporter* reporter) {
31 RefClass* r0 = new RefClass(0);
32
33 SkRefPtr<RefClass> rc0;
34 REPORTER_ASSERT(reporter, rc0.get() == NULL);
35 REPORTER_ASSERT(reporter, !rc0);
36
37 SkRefPtr<RefClass> rc1;
38 REPORTER_ASSERT(reporter, rc0 == rc1);
reed@google.comddbf4c82011-03-08 16:06:06 +000039 REPORTER_ASSERT(reporter, rc0.get() != r0);
reed@android.comb00cd722010-04-16 20:35:47 +000040
41 rc0 = r0;
42 REPORTER_ASSERT(reporter, rc0);
43 REPORTER_ASSERT(reporter, rc0 != rc1);
reed@google.comddbf4c82011-03-08 16:06:06 +000044 REPORTER_ASSERT(reporter, rc0.get() == r0);
reed@android.comb00cd722010-04-16 20:35:47 +000045
46 rc1 = rc0;
47 REPORTER_ASSERT(reporter, rc1);
48 REPORTER_ASSERT(reporter, rc0 == rc1);
reed@google.comddbf4c82011-03-08 16:06:06 +000049 REPORTER_ASSERT(reporter, rc0.get() == r0);
reed@android.comb00cd722010-04-16 20:35:47 +000050
51 rc0 = NULL;
52 REPORTER_ASSERT(reporter, rc0.get() == NULL);
53 REPORTER_ASSERT(reporter, !rc0);
54 REPORTER_ASSERT(reporter, rc0 != rc1);
55
56 r0->unref();
57}
58
reed@google.coma67573e2011-02-25 18:10:29 +000059static void test_autounref(skiatest::Reporter* reporter) {
60 RefClass obj(0);
61 REPORTER_ASSERT(reporter, 1 == obj.getRefCnt());
62
63 SkAutoTUnref<RefClass> tmp(&obj);
64 REPORTER_ASSERT(reporter, &obj == tmp.get());
65 REPORTER_ASSERT(reporter, 1 == obj.getRefCnt());
66
67 REPORTER_ASSERT(reporter, &obj == tmp.detach());
68 REPORTER_ASSERT(reporter, 1 == obj.getRefCnt());
69 REPORTER_ASSERT(reporter, NULL == tmp.detach());
70 REPORTER_ASSERT(reporter, NULL == tmp.get());
71
72 obj.ref();
73 REPORTER_ASSERT(reporter, 2 == obj.getRefCnt());
74 {
75 SkAutoTUnref<RefClass> tmp2(&obj);
76 }
77 REPORTER_ASSERT(reporter, 1 == obj.getRefCnt());
78}
79
epoger@google.combcc56832011-05-20 17:35:46 +000080/////////////////////////////////////////////////////////////////////////////
reed@android.comb00cd722010-04-16 20:35:47 +000081
reed@android.comed673312009-02-27 16:24:51 +000082#define kSEARCH_COUNT 91
83
84static void test_search(skiatest::Reporter* reporter) {
85 int i, array[kSEARCH_COUNT];
86 SkRandom rand;
87
88 for (i = 0; i < kSEARCH_COUNT; i++) {
89 array[i] = rand.nextS();
90 }
91
92 SkTHeapSort<int>(array, kSEARCH_COUNT);
93 // make sure we got sorted properly
94 for (i = 1; i < kSEARCH_COUNT; i++) {
95 REPORTER_ASSERT(reporter, array[i-1] <= array[i]);
96 }
97
98 // make sure we can find all of our values
99 for (i = 0; i < kSEARCH_COUNT; i++) {
100 int index = SkTSearch<int>(array, kSEARCH_COUNT, array[i], sizeof(int));
101 REPORTER_ASSERT(reporter, index == i);
102 }
103
104 // make sure that random values are either found, or the correct
105 // insertion index is returned
106 for (i = 0; i < 10000; i++) {
107 int value = rand.nextS();
108 int index = SkTSearch<int>(array, kSEARCH_COUNT, value, sizeof(int));
109
110 if (index >= 0) {
111 REPORTER_ASSERT(reporter,
112 index < kSEARCH_COUNT && array[index] == value);
113 } else {
114 index = ~index;
115 REPORTER_ASSERT(reporter, index <= kSEARCH_COUNT);
116 if (index < kSEARCH_COUNT) {
117 REPORTER_ASSERT(reporter, value < array[index]);
118 if (index > 0) {
119 REPORTER_ASSERT(reporter, value > array[index - 1]);
120 }
121 } else {
122 // we should append the new value
123 REPORTER_ASSERT(reporter, value > array[kSEARCH_COUNT - 1]);
124 }
125 }
126 }
127}
128
129static void test_utf16(skiatest::Reporter* reporter) {
130 static const SkUnichar gUni[] = {
131 0x10000, 0x18080, 0x20202, 0xFFFFF, 0x101234
132 };
reed@android.com80e39a72009-04-02 16:59:40 +0000133
reed@android.comed673312009-02-27 16:24:51 +0000134 uint16_t buf[2];
reed@android.com80e39a72009-04-02 16:59:40 +0000135
reed@android.comed673312009-02-27 16:24:51 +0000136 for (size_t i = 0; i < SK_ARRAY_COUNT(gUni); i++) {
137 size_t count = SkUTF16_FromUnichar(gUni[i], buf);
138 REPORTER_ASSERT(reporter, count == 2);
139 size_t count2 = SkUTF16_CountUnichars(buf, 2);
140 REPORTER_ASSERT(reporter, count2 == 1);
141 const uint16_t* ptr = buf;
142 SkUnichar c = SkUTF16_NextUnichar(&ptr);
143 REPORTER_ASSERT(reporter, c == gUni[i]);
144 REPORTER_ASSERT(reporter, ptr - buf == 2);
145 }
146}
147
148static void TestUTF(skiatest::Reporter* reporter) {
149 static const struct {
150 const char* fUtf8;
151 SkUnichar fUni;
152 } gTest[] = {
153 { "a", 'a' },
154 { "\x7f", 0x7f },
155 { "\xC2\x80", 0x80 },
156 { "\xC3\x83", (3 << 6) | 3 },
157 { "\xDF\xBF", 0x7ff },
158 { "\xE0\xA0\x80", 0x800 },
159 { "\xE0\xB0\xB8", 0xC38 },
160 { "\xE3\x83\x83", (3 << 12) | (3 << 6) | 3 },
161 { "\xEF\xBF\xBF", 0xFFFF },
162 { "\xF0\x90\x80\x80", 0x10000 },
163 { "\xF3\x83\x83\x83", (3 << 18) | (3 << 12) | (3 << 6) | 3 }
164 };
165
166 for (size_t i = 0; i < SK_ARRAY_COUNT(gTest); i++) {
167 const char* p = gTest[i].fUtf8;
168 int n = SkUTF8_CountUnichars(p);
169 SkUnichar u0 = SkUTF8_ToUnichar(gTest[i].fUtf8);
170 SkUnichar u1 = SkUTF8_NextUnichar(&p);
171
172 REPORTER_ASSERT(reporter, n == 1);
173 REPORTER_ASSERT(reporter, u0 == u1);
174 REPORTER_ASSERT(reporter, u0 == gTest[i].fUni);
175 REPORTER_ASSERT(reporter,
176 p - gTest[i].fUtf8 == (int)strlen(gTest[i].fUtf8));
177 }
reed@android.com80e39a72009-04-02 16:59:40 +0000178
reed@android.comed673312009-02-27 16:24:51 +0000179 test_utf16(reporter);
180 test_search(reporter);
reed@android.comb00cd722010-04-16 20:35:47 +0000181 test_refptr(reporter);
reed@google.coma67573e2011-02-25 18:10:29 +0000182 test_autounref(reporter);
reed@android.comed673312009-02-27 16:24:51 +0000183}
184
reed@android.comd8730ea2009-02-27 22:06:06 +0000185#include "TestClassDef.h"
reed@google.coma67573e2011-02-25 18:10:29 +0000186DEFINE_TESTCLASS("Utils", UtfTestClass, TestUTF)