blob: fdc074547d4150782789b0dea853a0f2344db57a [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@google.comdde09562011-05-23 12:21:05 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * 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.
reed@google.comdde09562011-05-23 12:21:05 +00007 */
8
9
epoger@google.comec3ed6a2011-07-28 14:26:00 +000010
scroggo@google.comdd394882012-07-24 20:47:55 +000011#include "SkRandom.h"
reed@google.comdde09562011-05-23 12:21:05 +000012#include "SkReader32.h"
13#include "SkWriter32.h"
14#include "Test.h"
15
reed@google.com1cf58d02012-08-30 14:03:21 +000016static void check_contents(skiatest::Reporter* reporter, const SkWriter32& writer,
17 const void* expected, size_t size) {
18 SkAutoSMalloc<256> storage(size);
19 REPORTER_ASSERT(reporter, writer.bytesWritten() == size);
20 writer.flatten(storage.get());
21 REPORTER_ASSERT(reporter, !memcmp(storage.get(), expected, size));
22}
23
24static void test_rewind(skiatest::Reporter* reporter) {
25 SkSWriter32<32> writer(32);
26 int32_t array[3] = { 1, 2, 4 };
27
28 REPORTER_ASSERT(reporter, 0 == writer.bytesWritten());
29 for (size_t i = 0; i < SK_ARRAY_COUNT(array); ++i) {
30 writer.writeInt(array[i]);
31 }
32 check_contents(reporter, writer, array, sizeof(array));
33
34 writer.rewindToOffset(2*sizeof(int32_t));
35 REPORTER_ASSERT(reporter, sizeof(array) - 4 == writer.bytesWritten());
36 writer.writeInt(3);
37 REPORTER_ASSERT(reporter, sizeof(array) == writer.bytesWritten());
38 array[2] = 3;
39 check_contents(reporter, writer, array, sizeof(array));
40}
41
reed@google.com51c62a62012-06-12 20:47:53 +000042static void test_ptr(skiatest::Reporter* reporter) {
43 SkSWriter32<32> writer(32);
rmistry@google.comd6176b02012-08-23 18:14:13 +000044
reed@google.com51c62a62012-06-12 20:47:53 +000045 void* p0 = reporter;
46 void* p1 = &writer;
47
48 // try writing ptrs where at least one of them may be at a non-multiple of
49 // 8 boundary, to confirm this works on 64bit machines.
50
51 writer.writePtr(p0);
52 writer.write8(0x33);
53 writer.writePtr(p1);
54 writer.write8(0x66);
55
56 size_t size = writer.size();
57 REPORTER_ASSERT(reporter, 2 * sizeof(void*) + 2 * sizeof(int32_t));
58
59 char buffer[32];
60 SkASSERT(sizeof(buffer) >= size);
61 writer.flatten(buffer);
62
63 SkReader32 reader(buffer, size);
64 REPORTER_ASSERT(reporter, reader.readPtr() == p0);
65 REPORTER_ASSERT(reporter, reader.readInt() == 0x33);
66 REPORTER_ASSERT(reporter, reader.readPtr() == p1);
67 REPORTER_ASSERT(reporter, reader.readInt() == 0x66);
68}
69
reed@google.comdde09562011-05-23 12:21:05 +000070static void test1(skiatest::Reporter* reporter, SkWriter32* writer) {
71 const uint32_t data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
72 for (size_t i = 0; i < SK_ARRAY_COUNT(data); ++i) {
73 REPORTER_ASSERT(reporter, i*4 == writer->size());
74 writer->write32(data[i]);
75 uint32_t* addr = writer->peek32(i * 4);
76 REPORTER_ASSERT(reporter, data[i] == *addr);
77 }
78
79 char buffer[sizeof(data)];
80 REPORTER_ASSERT(reporter, sizeof(buffer) == writer->size());
81 writer->flatten(buffer);
82 REPORTER_ASSERT(reporter, !memcmp(data, buffer, sizeof(buffer)));
83}
84
85static void test2(skiatest::Reporter* reporter, SkWriter32* writer) {
86 static const char gStr[] = "abcdefghimjklmnopqrstuvwxyz";
87 size_t i;
88
89 size_t len = 0;
90 for (i = 0; i <= 26; ++i) {
91 len += SkWriter32::WriteStringSize(gStr, i);
92 writer->writeString(gStr, i);
93 }
94 REPORTER_ASSERT(reporter, writer->size() == len);
95
96 SkAutoMalloc storage(len);
97 writer->flatten(storage.get());
98
99 SkReader32 reader;
100 reader.setMemory(storage.get(), len);
101 for (i = 0; i <= 26; ++i) {
102 REPORTER_ASSERT(reporter, !reader.eof());
103 const char* str = reader.readString(&len);
104 REPORTER_ASSERT(reporter, i == len);
105 REPORTER_ASSERT(reporter, strlen(str) == len);
106 REPORTER_ASSERT(reporter, !memcmp(str, gStr, len));
scroggo@google.come9617eb2012-07-23 13:44:10 +0000107 // Ensure that the align4 of the string is padded with zeroes.
108 size_t alignedSize = SkAlign4(len + 1);
109 for (size_t j = len; j < alignedSize; j++) {
110 REPORTER_ASSERT(reporter, 0 == str[j]);
111 }
reed@google.comdde09562011-05-23 12:21:05 +0000112 }
113 REPORTER_ASSERT(reporter, reader.eof());
114}
115
scroggo@google.comdd394882012-07-24 20:47:55 +0000116static void testWritePad(skiatest::Reporter* reporter, SkWriter32* writer) {
117 // Create some random data to write.
118 const size_t dataSize = 10<<2;
119 SkASSERT(SkIsAlign4(dataSize));
120
121 SkAutoMalloc originalData(dataSize);
122 {
123 SkRandom rand(0);
124 uint32_t* ptr = static_cast<uint32_t*>(originalData.get());
125 uint32_t* stop = ptr + (dataSize>>2);
126 while (ptr < stop) {
127 *ptr++ = rand.nextU();
128 }
129
130 // Write the random data to the writer at different lengths for
131 // different alignments.
132 for (size_t len = 0; len < dataSize; len++) {
133 writer->writePad(originalData.get(), len);
134 }
135 }
136
137 uint32_t totalBytes = writer->size();
138
139 SkAutoMalloc readStorage(totalBytes);
140 writer->flatten(readStorage.get());
141
142 SkReader32 reader;
143 reader.setMemory(readStorage.get(), totalBytes);
144
145 for (size_t len = 0; len < dataSize; len++) {
146 const char* readPtr = static_cast<const char*>(reader.skip(len));
147 // Ensure that the data read is the same as what was written.
148 REPORTER_ASSERT(reporter, memcmp(readPtr, originalData.get(), len) == 0);
149 // Ensure that the rest is padded with zeroes.
150 const char* stop = readPtr + SkAlign4(len);
151 readPtr += len;
152 while (readPtr < stop) {
153 REPORTER_ASSERT(reporter, *readPtr++ == 0);
154 }
155 }
156}
157
reed@google.comdde09562011-05-23 12:21:05 +0000158static void Tests(skiatest::Reporter* reporter) {
159 // dynamic allocator
160 {
161 SkWriter32 writer(256 * 4);
162 REPORTER_ASSERT(reporter, NULL == writer.getSingleBlock());
163 test1(reporter, &writer);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000164
reed@google.comdde09562011-05-23 12:21:05 +0000165 writer.reset();
166 test2(reporter, &writer);
scroggo@google.comdd394882012-07-24 20:47:55 +0000167
168 writer.reset();
169 testWritePad(reporter, &writer);
reed@google.comdde09562011-05-23 12:21:05 +0000170 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000171
reed@google.comdde09562011-05-23 12:21:05 +0000172 // single-block
173 {
174 SkWriter32 writer(0);
175 uint32_t storage[256];
176 REPORTER_ASSERT(reporter, NULL == writer.getSingleBlock());
177 writer.reset(storage, sizeof(storage));
178 REPORTER_ASSERT(reporter, (void*)storage == writer.getSingleBlock());
179 test1(reporter, &writer);
180
181 writer.reset(storage, sizeof(storage));
182 test2(reporter, &writer);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000183
scroggo@google.comdd394882012-07-24 20:47:55 +0000184 writer.reset(storage, sizeof(storage));
185 testWritePad(reporter, &writer);
reed@google.comdde09562011-05-23 12:21:05 +0000186 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000187
reed@google.come49aca92012-04-24 21:12:39 +0000188 // small storage
189 {
reed@google.com51c62a62012-06-12 20:47:53 +0000190 SkSWriter32<8 * sizeof(intptr_t)> writer(100);
reed@google.come49aca92012-04-24 21:12:39 +0000191 test1(reporter, &writer);
192 writer.reset(); // should just rewind our storage
193 test2(reporter, &writer);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000194
scroggo@google.comdd394882012-07-24 20:47:55 +0000195 writer.reset();
196 testWritePad(reporter, &writer);
reed@google.come49aca92012-04-24 21:12:39 +0000197 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000198
reed@google.come49aca92012-04-24 21:12:39 +0000199 // large storage
200 {
reed@google.com51c62a62012-06-12 20:47:53 +0000201 SkSWriter32<1024 * sizeof(intptr_t)> writer(100);
reed@google.come49aca92012-04-24 21:12:39 +0000202 test1(reporter, &writer);
203 writer.reset(); // should just rewind our storage
204 test2(reporter, &writer);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000205
scroggo@google.comdd394882012-07-24 20:47:55 +0000206 writer.reset();
207 testWritePad(reporter, &writer);
reed@google.come49aca92012-04-24 21:12:39 +0000208 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000209
reed@google.com51c62a62012-06-12 20:47:53 +0000210 test_ptr(reporter);
reed@google.com1cf58d02012-08-30 14:03:21 +0000211 test_rewind(reporter);
reed@google.comdde09562011-05-23 12:21:05 +0000212}
213
214#include "TestClassDef.h"
215DEFINE_TESTCLASS("Writer32", Writer32Class, Tests)
216