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.
6dde0956375e87027df2fdd80d430dd819c217aacreed@google.com */
7dde0956375e87027df2fdd80d430dd819c217aacreed@google.com
895e3c058ef633782f7549e9e1c2727d60dbc8ee5Hal Canary#include "SkAutoMalloc.h"
9dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com#include "SkRandom.h"
10dde0956375e87027df2fdd80d430dd819c217aacreed@google.com#include "SkReader32.h"
11dde0956375e87027df2fdd80d430dd819c217aacreed@google.com#include "SkWriter32.h"
128f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h"
13dde0956375e87027df2fdd80d430dd819c217aacreed@google.com
141cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.comstatic void check_contents(skiatest::Reporter* reporter, const SkWriter32& writer,
151cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com                           const void* expected, size_t size) {
161cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    SkAutoSMalloc<256> storage(size);
171cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    REPORTER_ASSERT(reporter, writer.bytesWritten() == size);
181cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    writer.flatten(storage.get());
191cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    REPORTER_ASSERT(reporter, !memcmp(storage.get(), expected, size));
201cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com}
211cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com
228b4ba6373559026f7e24de1b8b487d8b72256dc1mtklein@google.com
238b4ba6373559026f7e24de1b8b487d8b72256dc1mtklein@google.comstatic void test_reserve(skiatest::Reporter* reporter) {
248b4ba6373559026f7e24de1b8b487d8b72256dc1mtklein@google.com    // There used to be a bug where we'd assert your first reservation had to
258b4ba6373559026f7e24de1b8b487d8b72256dc1mtklein@google.com    // fit in external storage if you used it.  This would crash in debug mode.
268b4ba6373559026f7e24de1b8b487d8b72256dc1mtklein@google.com    uint8_t storage[4];
2719382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    SkWriter32 writer(storage, sizeof(storage));
288b4ba6373559026f7e24de1b8b487d8b72256dc1mtklein@google.com    writer.reserve(40);
298b4ba6373559026f7e24de1b8b487d8b72256dc1mtklein@google.com}
308b4ba6373559026f7e24de1b8b487d8b72256dc1mtklein@google.com
3147fa13640b7c8615aa7aee0d5b1d63a7bd6ed44ecommit-bot@chromium.orgstatic void test_string_null(skiatest::Reporter* reporter) {
3247fa13640b7c8615aa7aee0d5b1d63a7bd6ed44ecommit-bot@chromium.org    uint8_t storage[8];
3319382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    SkWriter32 writer(storage, sizeof(storage));
3447fa13640b7c8615aa7aee0d5b1d63a7bd6ed44ecommit-bot@chromium.org
3596fcdcc219d2a0d3579719b84b28bede76efba64halcanary    // Can we write nullptr?
3696fcdcc219d2a0d3579719b84b28bede76efba64halcanary    writer.writeString(nullptr);
370038c12f337b7037ef698e2723099c7e3b19c4camtklein@google.com    const int32_t expected[] = { 0x0, 0x0 };
380038c12f337b7037ef698e2723099c7e3b19c4camtklein@google.com    check_contents(reporter, writer, expected, sizeof(expected));
3947fa13640b7c8615aa7aee0d5b1d63a7bd6ed44ecommit-bot@chromium.org}
4047fa13640b7c8615aa7aee0d5b1d63a7bd6ed44ecommit-bot@chromium.org
411cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.comstatic void test_rewind(skiatest::Reporter* reporter) {
4219382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    SkSWriter32<32> writer;
431cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    int32_t array[3] = { 1, 2, 4 };
44a27096b4740775ae141fd0abaf456d706065c5eeskia.committer@gmail.com
451cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    REPORTER_ASSERT(reporter, 0 == writer.bytesWritten());
461cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    for (size_t i = 0; i < SK_ARRAY_COUNT(array); ++i) {
471cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com        writer.writeInt(array[i]);
481cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    }
491cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    check_contents(reporter, writer, array, sizeof(array));
501cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com
511cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    writer.rewindToOffset(2*sizeof(int32_t));
521cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    REPORTER_ASSERT(reporter, sizeof(array) - 4 == writer.bytesWritten());
531cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    writer.writeInt(3);
541cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    REPORTER_ASSERT(reporter, sizeof(array) == writer.bytesWritten());
551cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    array[2] = 3;
561cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    check_contents(reporter, writer, array, sizeof(array));
57d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com
58d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com    // test rewinding past allocated chunks. This used to crash because we
59d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com    // didn't truncate our link-list after freeing trailing blocks
60d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com    {
6119382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org        SkWriter32 writer;
62d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com        for (int i = 0; i < 100; ++i) {
63d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com            writer.writeInt(i);
64d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com        }
65d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com        REPORTER_ASSERT(reporter, 100*4 == writer.bytesWritten());
66d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com        for (int j = 100*4; j >= 0; j -= 16) {
67d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com            writer.rewindToOffset(j);
68d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com        }
69d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com        REPORTER_ASSERT(reporter, writer.bytesWritten() < 16);
70d7e27822030b5ab7729e32c6d29227210dfe88abreed@google.com    }
711cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com}
721cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com
7351c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.comstatic void test_ptr(skiatest::Reporter* reporter) {
7419382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    SkSWriter32<32> writer;
75d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
7651c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    void* p0 = reporter;
7751c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    void* p1 = &writer;
7851c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com
7951c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    // try writing ptrs where at least one of them may be at a non-multiple of
8051c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    // 8 boundary, to confirm this works on 64bit machines.
8151c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com
8251c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    writer.writePtr(p0);
8351c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    writer.write8(0x33);
8451c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    writer.writePtr(p1);
8551c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    writer.write8(0x66);
8651c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com
874469938e92d779dff05e745559e67907bbf21e78reed@google.com    size_t size = writer.bytesWritten();
8851c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    REPORTER_ASSERT(reporter, 2 * sizeof(void*) + 2 * sizeof(int32_t));
8951c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com
9051c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    char buffer[32];
9151c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    SkASSERT(sizeof(buffer) >= size);
9251c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    writer.flatten(buffer);
9351c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com
9451c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    SkReader32 reader(buffer, size);
9551c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    REPORTER_ASSERT(reporter, reader.readPtr() == p0);
9651c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    REPORTER_ASSERT(reporter, reader.readInt() == 0x33);
9751c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    REPORTER_ASSERT(reporter, reader.readPtr() == p1);
9851c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    REPORTER_ASSERT(reporter, reader.readInt() == 0x66);
9951c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com}
10051c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com
101dde0956375e87027df2fdd80d430dd819c217aacreed@google.comstatic void test1(skiatest::Reporter* reporter, SkWriter32* writer) {
102dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    const uint32_t data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
103dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    for (size_t i = 0; i < SK_ARRAY_COUNT(data); ++i) {
1044469938e92d779dff05e745559e67907bbf21e78reed@google.com        REPORTER_ASSERT(reporter, i*4 == writer->bytesWritten());
105dde0956375e87027df2fdd80d430dd819c217aacreed@google.com        writer->write32(data[i]);
106536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org        REPORTER_ASSERT(reporter, data[i] == writer->readTAt<uint32_t>(i * 4));
107dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    }
108dde0956375e87027df2fdd80d430dd819c217aacreed@google.com
109dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    char buffer[sizeof(data)];
1104469938e92d779dff05e745559e67907bbf21e78reed@google.com    REPORTER_ASSERT(reporter, sizeof(buffer) == writer->bytesWritten());
111dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    writer->flatten(buffer);
112dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    REPORTER_ASSERT(reporter, !memcmp(data, buffer, sizeof(buffer)));
113dde0956375e87027df2fdd80d430dd819c217aacreed@google.com}
114dde0956375e87027df2fdd80d430dd819c217aacreed@google.com
115dde0956375e87027df2fdd80d430dd819c217aacreed@google.comstatic void test2(skiatest::Reporter* reporter, SkWriter32* writer) {
116dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    static const char gStr[] = "abcdefghimjklmnopqrstuvwxyz";
117dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    size_t i;
118dde0956375e87027df2fdd80d430dd819c217aacreed@google.com
119dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    size_t len = 0;
120dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    for (i = 0; i <= 26; ++i) {
121dde0956375e87027df2fdd80d430dd819c217aacreed@google.com        len += SkWriter32::WriteStringSize(gStr, i);
122dde0956375e87027df2fdd80d430dd819c217aacreed@google.com        writer->writeString(gStr, i);
123dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    }
1244469938e92d779dff05e745559e67907bbf21e78reed@google.com    REPORTER_ASSERT(reporter, writer->bytesWritten() == len);
125dde0956375e87027df2fdd80d430dd819c217aacreed@google.com
126dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    SkAutoMalloc storage(len);
127dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    writer->flatten(storage.get());
128dde0956375e87027df2fdd80d430dd819c217aacreed@google.com
129dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    SkReader32 reader;
130dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    reader.setMemory(storage.get(), len);
131dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    for (i = 0; i <= 26; ++i) {
132dde0956375e87027df2fdd80d430dd819c217aacreed@google.com        REPORTER_ASSERT(reporter, !reader.eof());
133dde0956375e87027df2fdd80d430dd819c217aacreed@google.com        const char* str = reader.readString(&len);
134dde0956375e87027df2fdd80d430dd819c217aacreed@google.com        REPORTER_ASSERT(reporter, i == len);
135dde0956375e87027df2fdd80d430dd819c217aacreed@google.com        REPORTER_ASSERT(reporter, strlen(str) == len);
136dde0956375e87027df2fdd80d430dd819c217aacreed@google.com        REPORTER_ASSERT(reporter, !memcmp(str, gStr, len));
137e9617eb352483bf152dfd3a38083ffb99c4694b9scroggo@google.com        // Ensure that the align4 of the string is padded with zeroes.
138e9617eb352483bf152dfd3a38083ffb99c4694b9scroggo@google.com        size_t alignedSize = SkAlign4(len + 1);
139e9617eb352483bf152dfd3a38083ffb99c4694b9scroggo@google.com        for (size_t j = len; j < alignedSize; j++) {
140e9617eb352483bf152dfd3a38083ffb99c4694b9scroggo@google.com            REPORTER_ASSERT(reporter, 0 == str[j]);
141e9617eb352483bf152dfd3a38083ffb99c4694b9scroggo@google.com        }
142dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    }
143dde0956375e87027df2fdd80d430dd819c217aacreed@google.com    REPORTER_ASSERT(reporter, reader.eof());
144dde0956375e87027df2fdd80d430dd819c217aacreed@google.com}
145dde0956375e87027df2fdd80d430dd819c217aacreed@google.com
146dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.comstatic void testWritePad(skiatest::Reporter* reporter, SkWriter32* writer) {
147dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com    // Create some random data to write.
148565901db954c231840750ea955ed31b820b9ade8scroggo    const size_t dataSize = 10;
149dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com
150565901db954c231840750ea955ed31b820b9ade8scroggo    SkAutoTMalloc<uint32_t> originalData(dataSize);
151dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com    {
152e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand(0);
153565901db954c231840750ea955ed31b820b9ade8scroggo        for (size_t i = 0; i < dataSize; i++) {
154565901db954c231840750ea955ed31b820b9ade8scroggo            originalData[(int) i] = rand.nextU();
155dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        }
156dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com
157dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        // Write  the random data to the writer at different lengths for
158dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        // different alignments.
159dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        for (size_t len = 0; len < dataSize; len++) {
160dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com            writer->writePad(originalData.get(), len);
161dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        }
162dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com    }
163dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com
164fbaace082745a0e301186b2d3b84af62e2fb87ecbsalomon    size_t totalBytes = writer->bytesWritten();
165dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com
166dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com    SkAutoMalloc readStorage(totalBytes);
167dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com    writer->flatten(readStorage.get());
168dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com
169dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com    SkReader32 reader;
170dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com    reader.setMemory(readStorage.get(), totalBytes);
171dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com
172dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com    for (size_t len = 0; len < dataSize; len++) {
173dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        const char* readPtr = static_cast<const char*>(reader.skip(len));
174dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        // Ensure that the data read is the same as what was written.
175dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        REPORTER_ASSERT(reporter, memcmp(readPtr, originalData.get(), len) == 0);
176dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        // Ensure that the rest is padded with zeroes.
177dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        const char* stop = readPtr + SkAlign4(len);
178dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        readPtr += len;
179dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        while (readPtr < stop) {
180dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com            REPORTER_ASSERT(reporter, *readPtr++ == 0);
181dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com        }
182dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com    }
183dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com}
184dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com
185536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.orgstatic void testOverwriteT(skiatest::Reporter* reporter, SkWriter32* writer) {
186536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    const size_t padding = 64;
187536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org
188536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    const uint32_t uint1 = 0x12345678;
189536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    const uint32_t uint2 = 0x98765432;
190536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    const SkScalar scalar1 = 1234.5678f;
191536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    const SkScalar scalar2 = 9876.5432f;
192536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    const SkRect rect1 = SkRect::MakeXYWH(1, 2, 3, 4);
193536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    const SkRect rect2 = SkRect::MakeXYWH(5, 6, 7, 8);
194536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org
195536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    for (size_t i = 0; i < (padding / 4); ++i) {
196536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org        writer->write32(0);
197536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    }
198536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org
199536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    writer->write32(uint1);
200536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    writer->writeRect(rect1);
201536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    writer->writeScalar(scalar1);
202536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org
203536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    for (size_t i = 0; i < (padding / 4); ++i) {
204536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org        writer->write32(0);
205536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    }
206536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org
207536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    REPORTER_ASSERT(reporter, writer->readTAt<uint32_t>(padding) == uint1);
208536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    REPORTER_ASSERT(reporter, writer->readTAt<SkRect>(padding + sizeof(uint32_t)) == rect1);
209536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    REPORTER_ASSERT(reporter, writer->readTAt<SkScalar>(
210536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org                        padding + sizeof(uint32_t) + sizeof(SkRect)) == scalar1);
211536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org
212536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    writer->overwriteTAt(padding, uint2);
213536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    writer->overwriteTAt(padding + sizeof(uint32_t), rect2);
214536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    writer->overwriteTAt(padding + sizeof(uint32_t) + sizeof(SkRect), scalar2);
215536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org
216536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    REPORTER_ASSERT(reporter, writer->readTAt<uint32_t>(padding) == uint2);
217536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    REPORTER_ASSERT(reporter, writer->readTAt<SkRect>(padding + sizeof(uint32_t)) == rect2);
218536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    REPORTER_ASSERT(reporter, writer->readTAt<SkScalar>(
219536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org                        padding + sizeof(uint32_t) + sizeof(SkRect)) == scalar2);
220536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org}
221536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org
22219382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.orgDEF_TEST(Writer32_dynamic, reporter) {
22319382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    SkWriter32 writer;
22419382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    test1(reporter, &writer);
225d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
22619382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    writer.reset();
22719382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    test2(reporter, &writer);
228dd3948899725041bf52e3a4eea922f9961ee0a9bscroggo@google.com
22919382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    writer.reset();
23019382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    testWritePad(reporter, &writer);
231536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org
232536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    writer.reset();
233536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    testOverwriteT(reporter, &writer);
23419382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org}
235d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
23619382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.orgDEF_TEST(Writer32_small, reporter) {
23719382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    SkSWriter32<8 * sizeof(intptr_t)> writer;
23819382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    test1(reporter, &writer);
23919382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    writer.reset(); // should just rewind our storage
24019382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    test2(reporter, &writer);
241d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
24219382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    writer.reset();
24319382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    testWritePad(reporter, &writer);
244536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org
245536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    writer.reset();
246536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    testOverwriteT(reporter, &writer);
24719382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org}
248d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
24919382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.orgDEF_TEST(Writer32_large, reporter) {
25019382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    SkSWriter32<1024 * sizeof(intptr_t)> writer;
25119382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    test1(reporter, &writer);
25219382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    writer.reset(); // should just rewind our storage
25319382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    test2(reporter, &writer);
254d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
25519382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    writer.reset();
25619382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org    testWritePad(reporter, &writer);
257536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org
258536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    writer.reset();
259536ac5e20c2ec2008993c0677ba8cbc5ae0f34cfcommit-bot@chromium.org    testOverwriteT(reporter, &writer);
26019382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org}
261d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
26219382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.orgDEF_TEST(Writer32_misc, reporter) {
2638b4ba6373559026f7e24de1b8b487d8b72256dc1mtklein@google.com    test_reserve(reporter);
26447fa13640b7c8615aa7aee0d5b1d63a7bd6ed44ecommit-bot@chromium.org    test_string_null(reporter);
26551c62a6cfadc302bb65bb5a98e358c93223dc73freed@google.com    test_ptr(reporter);
2661cf58d03a87e1ff17cd47e9de3da4c678456618dreed@google.com    test_rewind(reporter);
267dde0956375e87027df2fdd80d430dd819c217aacreed@google.com}
268c30dcb9b128887c7e16afe32fdf35105cc42380bcommit-bot@chromium.org
269f70b531daaf47db1ee95c70da9843f1dd1f418d3reedDEF_TEST(Writer32_data, reporter) {
270f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    const char* str = "0123456789";
27138d909ec2875f79952de08f36adfaac5680d2c53bungeman    sk_sp<SkData> data0(SkData::MakeWithCString(str));
27238d909ec2875f79952de08f36adfaac5680d2c53bungeman    sk_sp<SkData> data1(SkData::MakeEmpty());
273f70b531daaf47db1ee95c70da9843f1dd1f418d3reed
274f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    const size_t sizes[] = {
275f70b531daaf47db1ee95c70da9843f1dd1f418d3reed        SkWriter32::WriteDataSize(nullptr),
27638d909ec2875f79952de08f36adfaac5680d2c53bungeman        SkWriter32::WriteDataSize(data0.get()),
27738d909ec2875f79952de08f36adfaac5680d2c53bungeman        SkWriter32::WriteDataSize(data1.get()),
278f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    };
2799d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary
280f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    SkSWriter32<1000> writer;
281f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    size_t sizeWritten = 0;
282f70b531daaf47db1ee95c70da9843f1dd1f418d3reed
283f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    writer.writeData(nullptr);
284f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    sizeWritten += sizes[0];
285f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    REPORTER_ASSERT(reporter, sizeWritten == writer.bytesWritten());
2869d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary
28738d909ec2875f79952de08f36adfaac5680d2c53bungeman    writer.writeData(data0.get());
288f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    sizeWritten += sizes[1];
289f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    REPORTER_ASSERT(reporter, sizeWritten == writer.bytesWritten());
290f70b531daaf47db1ee95c70da9843f1dd1f418d3reed
29138d909ec2875f79952de08f36adfaac5680d2c53bungeman    writer.writeData(data1.get());
292f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    sizeWritten += sizes[2];
293f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    REPORTER_ASSERT(reporter, sizeWritten == writer.bytesWritten());
294f70b531daaf47db1ee95c70da9843f1dd1f418d3reed
295fde05114e6c4107b36e1aa571c64d31def40f613reed    auto result(writer.snapshotAsData());
296f70b531daaf47db1ee95c70da9843f1dd1f418d3reed
297f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    SkReader32 reader(result->data(), result->size());
298fde05114e6c4107b36e1aa571c64d31def40f613reed    auto d0(reader.readData()),
299fde05114e6c4107b36e1aa571c64d31def40f613reed         d1(reader.readData()),
300fde05114e6c4107b36e1aa571c64d31def40f613reed         d2(reader.readData());
301f70b531daaf47db1ee95c70da9843f1dd1f418d3reed
302f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    REPORTER_ASSERT(reporter, 0 == d0->size());
303f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    REPORTER_ASSERT(reporter, strlen(str)+1 == d1->size());
304f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    REPORTER_ASSERT(reporter, !memcmp(str, d1->data(), strlen(str)+1));
305f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    REPORTER_ASSERT(reporter, 0 == d2->size());
3069d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary
307f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    REPORTER_ASSERT(reporter, reader.offset() == sizeWritten);
308f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    REPORTER_ASSERT(reporter, reader.eof());
309f70b531daaf47db1ee95c70da9843f1dd1f418d3reed}
310