blob: 449149af95e4ecd304a08778ab79fa2fa968a76f [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@google.com1622c992011-06-14 19:22:21 +00008#include "Test.h"
reed@google.com8d0b5772011-06-24 13:07:31 +00009#include "SkData.h"
reed@google.com91bd4592012-07-11 17:24:49 +000010#include "SkDataSet.h"
reed@google.com8c5c7a92013-04-19 20:16:01 +000011#include "SkDataTable.h"
reed@google.com91bd4592012-07-11 17:24:49 +000012#include "SkStream.h"
13
14template <typename T> class SkTUnref {
15public:
16 SkTUnref(T* ref) : fRef(ref) {}
17 ~SkTUnref() { fRef->unref(); }
rmistry@google.comd6176b02012-08-23 18:14:13 +000018
reed@google.com91bd4592012-07-11 17:24:49 +000019 operator T*() { return fRef; }
20 operator const T*() { return fRef; }
21
22private:
23 T* fRef;
24};
25
reed@google.com8c5c7a92013-04-19 20:16:01 +000026static void test_simpletable(skiatest::Reporter* reporter) {
27 const int idata[] = { 1, 4, 9, 16, 25, 63 };
28 int icount = SK_ARRAY_COUNT(idata);
29 SkAutoTUnref<SkDataTable> itable(SkDataTable::NewCopyArray(idata,
30 sizeof(idata[0]),
31 icount));
32 REPORTER_ASSERT(reporter, itable->count() == icount);
33 for (int i = 0; i < icount; ++i) {
34 size_t size;
35 REPORTER_ASSERT(reporter, sizeof(int) == itable->atSize(i));
36 REPORTER_ASSERT(reporter, *itable->atDataT<int>(i, &size) == idata[i]);
37 REPORTER_ASSERT(reporter, sizeof(int) == size);
38 }
39}
40
41static void test_vartable(skiatest::Reporter* reporter) {
42 const char* str[] = {
43 "", "a", "be", "see", "deigh", "ef", "ggggggggggggggggggggggggggg"
44 };
45 int count = SK_ARRAY_COUNT(str);
46 size_t sizes[SK_ARRAY_COUNT(str)];
47 for (int i = 0; i < count; ++i) {
48 sizes[i] = strlen(str[i]) + 1;
49 }
50
51 SkAutoTUnref<SkDataTable> table(SkDataTable::NewCopyArrays(
52 (const void*const*)str, sizes, count));
53
54 REPORTER_ASSERT(reporter, table->count() == count);
55 for (int i = 0; i < count; ++i) {
56 size_t size;
57 REPORTER_ASSERT(reporter, table->atSize(i) == sizes[i]);
58 REPORTER_ASSERT(reporter, !strcmp(table->atDataT<const char>(i, &size),
59 str[i]));
60 REPORTER_ASSERT(reporter, size == sizes[i]);
61
62 const char* s = table->atStr(i);
63 REPORTER_ASSERT(reporter, strlen(s) == strlen(str[i]));
64 }
65}
66
67static void test_tablebuilder(skiatest::Reporter* reporter) {
68 const char* str[] = {
69 "", "a", "be", "see", "deigh", "ef", "ggggggggggggggggggggggggggg"
70 };
71 int count = SK_ARRAY_COUNT(str);
72
73 SkDataTableBuilder builder(16);
74
75 for (int i = 0; i < count; ++i) {
76 builder.append(str[i], strlen(str[i]) + 1);
77 }
78 SkAutoTUnref<SkDataTable> table(builder.createDataTable());
79
80 REPORTER_ASSERT(reporter, table->count() == count);
81 for (int i = 0; i < count; ++i) {
82 size_t size;
83 REPORTER_ASSERT(reporter, table->atSize(i) == strlen(str[i]) + 1);
84 REPORTER_ASSERT(reporter, !strcmp(table->atDataT<const char>(i, &size),
85 str[i]));
86 REPORTER_ASSERT(reporter, size == strlen(str[i]) + 1);
87
88 const char* s = table->atStr(i);
89 REPORTER_ASSERT(reporter, strlen(s) == strlen(str[i]));
90 }
91}
92
93static void test_datatable(skiatest::Reporter* reporter) {
94 test_simpletable(reporter);
95 test_vartable(reporter);
96 test_tablebuilder(reporter);
97}
98
reed@google.com91bd4592012-07-11 17:24:49 +000099static void unrefAll(const SkDataSet::Pair pairs[], int count) {
100 for (int i = 0; i < count; ++i) {
101 pairs[i].fValue->unref();
102 }
103}
104
105// asserts that inner is a subset of outer
106static void test_dataset_subset(skiatest::Reporter* reporter,
107 const SkDataSet& outer, const SkDataSet& inner) {
108 SkDataSet::Iter iter(inner);
109 for (; !iter.done(); iter.next()) {
110 SkData* outerData = outer.find(iter.key());
111 REPORTER_ASSERT(reporter, outerData);
112 REPORTER_ASSERT(reporter, outerData->equals(iter.value()));
113 }
114}
115
116static void test_datasets_equal(skiatest::Reporter* reporter,
117 const SkDataSet& ds0, const SkDataSet& ds1) {
118 REPORTER_ASSERT(reporter, ds0.count() == ds1.count());
rmistry@google.comd6176b02012-08-23 18:14:13 +0000119
reed@google.com91bd4592012-07-11 17:24:49 +0000120 test_dataset_subset(reporter, ds0, ds1);
121 test_dataset_subset(reporter, ds1, ds0);
122}
123
124static void test_dataset(skiatest::Reporter* reporter, const SkDataSet& ds,
125 int count) {
126 REPORTER_ASSERT(reporter, ds.count() == count);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000127
reed@google.com91bd4592012-07-11 17:24:49 +0000128 SkDataSet::Iter iter(ds);
129 int index = 0;
130 for (; !iter.done(); iter.next()) {
humper@google.com05af1af2013-01-07 16:47:43 +0000131// const char* name = iter.key();
132// SkData* data = iter.value();
reed@google.com79382af2012-07-11 18:55:23 +0000133// SkDebugf("[%d] %s:%s\n", index, name, (const char*)data->bytes());
reed@google.com91bd4592012-07-11 17:24:49 +0000134 index += 1;
135 }
136 REPORTER_ASSERT(reporter, index == count);
137
138 SkDynamicMemoryWStream ostream;
139 ds.writeToStream(&ostream);
140 SkMemoryStream istream;
141 istream.setData(ostream.copyToData())->unref();
142 SkDataSet copy(&istream);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000143
reed@google.com91bd4592012-07-11 17:24:49 +0000144 test_datasets_equal(reporter, ds, copy);
145}
146
147static void test_dataset(skiatest::Reporter* reporter) {
148 SkDataSet set0(NULL, 0);
149 SkDataSet set1("hello", SkTUnref<SkData>(SkData::NewWithCString("world")));
rmistry@google.comd6176b02012-08-23 18:14:13 +0000150
reed@google.com91bd4592012-07-11 17:24:49 +0000151 const SkDataSet::Pair pairs[] = {
152 { "one", SkData::NewWithCString("1") },
153 { "two", SkData::NewWithCString("2") },
154 { "three", SkData::NewWithCString("3") },
155 };
156 SkDataSet set3(pairs, 3);
157 unrefAll(pairs, 3);
158
159 test_dataset(reporter, set0, 0);
160 test_dataset(reporter, set1, 1);
161 test_dataset(reporter, set3, 3);
162}
reed@google.com1622c992011-06-14 19:22:21 +0000163
164static void* gGlobal;
165
166static void delete_int_proc(const void* ptr, size_t len, void* context) {
167 int* data = (int*)ptr;
168 SkASSERT(context == gGlobal);
169 delete[] data;
170}
171
reed@google.com8d0b5772011-06-24 13:07:31 +0000172static void assert_len(skiatest::Reporter* reporter, SkData* ref, size_t len) {
reed@google.com1622c992011-06-14 19:22:21 +0000173 REPORTER_ASSERT(reporter, ref->size() == len);
174}
175
reed@google.com8d0b5772011-06-24 13:07:31 +0000176static void assert_data(skiatest::Reporter* reporter, SkData* ref,
reed@google.com1622c992011-06-14 19:22:21 +0000177 const void* data, size_t len) {
178 REPORTER_ASSERT(reporter, ref->size() == len);
179 REPORTER_ASSERT(reporter, !memcmp(ref->data(), data, len));
180}
181
reed@google.comdbc936d2012-06-28 15:40:09 +0000182static void test_cstring(skiatest::Reporter* reporter) {
183 const char str[] = "Hello world";
184 size_t len = strlen(str);
185
reed@google.coma63a8512012-07-02 20:29:00 +0000186 SkAutoTUnref<SkData> r0(SkData::NewWithCopy(str, len + 1));
reed@google.comdbc936d2012-06-28 15:40:09 +0000187 SkAutoTUnref<SkData> r1(SkData::NewWithCString(str));
188
189 REPORTER_ASSERT(reporter, r0->equals(r1));
190
191 SkAutoTUnref<SkData> r2(SkData::NewWithCString(NULL));
reed@google.coma63a8512012-07-02 20:29:00 +0000192 REPORTER_ASSERT(reporter, 1 == r2->size());
193 REPORTER_ASSERT(reporter, 0 == *r2->bytes());
reed@google.comdbc936d2012-06-28 15:40:09 +0000194}
195
reed@google.com91bd4592012-07-11 17:24:49 +0000196static void TestData(skiatest::Reporter* reporter) {
reed@google.com1622c992011-06-14 19:22:21 +0000197 const char* str = "We the people, in order to form a more perfect union.";
198 const int N = 10;
199
reed@google.comdbc936d2012-06-28 15:40:09 +0000200 SkAutoTUnref<SkData> r0(SkData::NewEmpty());
201 SkAutoTUnref<SkData> r1(SkData::NewWithCopy(str, strlen(str)));
202 SkAutoTUnref<SkData> r2(SkData::NewWithProc(new int[N], N*sizeof(int),
203 delete_int_proc, gGlobal));
204 SkAutoTUnref<SkData> r3(SkData::NewSubset(r1, 7, 6));
reed@google.com1622c992011-06-14 19:22:21 +0000205
reed@google.com1622c992011-06-14 19:22:21 +0000206 assert_len(reporter, r0, 0);
207 assert_len(reporter, r1, strlen(str));
208 assert_len(reporter, r2, N * sizeof(int));
209 assert_len(reporter, r3, 6);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000210
reed@google.com1622c992011-06-14 19:22:21 +0000211 assert_data(reporter, r1, str, strlen(str));
212 assert_data(reporter, r3, "people", 6);
213
reed@google.com8d0b5772011-06-24 13:07:31 +0000214 SkData* tmp = SkData::NewSubset(r1, strlen(str), 10);
reed@google.com1622c992011-06-14 19:22:21 +0000215 assert_len(reporter, tmp, 0);
216 tmp->unref();
reed@google.com8d0b5772011-06-24 13:07:31 +0000217 tmp = SkData::NewSubset(r1, 0, 0);
reed@google.com1622c992011-06-14 19:22:21 +0000218 assert_len(reporter, tmp, 0);
219 tmp->unref();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000220
reed@google.comdbc936d2012-06-28 15:40:09 +0000221 test_cstring(reporter);
reed@google.com91bd4592012-07-11 17:24:49 +0000222 test_dataset(reporter);
reed@google.com8c5c7a92013-04-19 20:16:01 +0000223 test_datatable(reporter);
reed@google.com1622c992011-06-14 19:22:21 +0000224}
225
226#include "TestClassDef.h"
reed@google.com91bd4592012-07-11 17:24:49 +0000227DEFINE_TESTCLASS("Data", DataTestClass, TestData)