Chromium Code Reviews| Index: tests/DataRefTest.cpp |
| diff --git a/tests/DataRefTest.cpp b/tests/DataRefTest.cpp |
| index 099e9098cb396a7a12d1d44bfe4c0d26801d9ca9..2b0467e98c0a47126bd687732146582453e06a71 100644 |
| --- a/tests/DataRefTest.cpp |
| +++ b/tests/DataRefTest.cpp |
| @@ -232,3 +232,84 @@ DEF_TEST(Data, reporter) { |
| test_cstring(reporter); |
| test_files(reporter); |
| } |
| + |
| +/////////////////////////////////////////////////////////////////////////////////////////////////// |
| +#include "SkRWBuffer.h" |
| + |
| +const char gABC[] = "abcdefghijklmnopqrstuvwxyz"; |
| + |
| +static void check_abcs(skiatest::Reporter* reporter, const char buffer[], size_t size) { |
| + REPORTER_ASSERT(reporter, size % 26 == 0); |
| + for (size_t offset = 0; offset < size; offset += 26) { |
| + REPORTER_ASSERT(reporter, !memcmp(&buffer[offset], gABC, 26)); |
| + } |
| +} |
| + |
| +// stream should contains an integral number of copies of gABC. |
| +static void check_alphabet_stream(skiatest::Reporter* reporter, SkStream* stream) { |
| + REPORTER_ASSERT(reporter, stream->hasLength()); |
| + size_t size = stream->getLength(); |
| + REPORTER_ASSERT(reporter, size % 26 == 0); |
| + |
| + SkAutoTMalloc<char> storage(size); |
| + char* array = storage.get(); |
| + size_t bytesRead = stream->read(array, size); |
| + REPORTER_ASSERT(reporter, bytesRead == size); |
| + check_abcs(reporter, array, size); |
| + |
| + // try checking backwards |
| + for (size_t offset = size; offset > 0; offset -= 26) { |
| + REPORTER_ASSERT(reporter, stream->seek(offset - 26)); |
| + REPORTER_ASSERT(reporter, stream->getPosition() == offset - 26); |
| + REPORTER_ASSERT(reporter, stream->read(array, 26) == 26); |
| + check_abcs(reporter, array, 26); |
| + REPORTER_ASSERT(reporter, stream->getPosition() == offset); |
| + } |
| +} |
| + |
| +// reader should contains an integral number of copies of gABC. |
| +static void check_alphabet_buffer(skiatest::Reporter* reporter, const SkROBuffer* reader) { |
| + size_t size = reader->size(); |
| + REPORTER_ASSERT(reporter, size % 26 == 0); |
| + |
| + SkAutoTMalloc<char> storage(size); |
| + SkROBuffer::Iter iter(reader); |
| + size_t offset = 0; |
| + do { |
| + SkASSERT(offset + iter.size() <= size); |
| + memcpy(storage.get() + offset, iter.data(), iter.size()); |
| + offset += iter.size(); |
| + } while (iter.next()); |
| + REPORTER_ASSERT(reporter, offset == size); |
| + check_abcs(reporter, storage.get(), size); |
| +} |
| + |
| +DEF_TEST(RWBuffer, reporter) { |
| + // Knowning that the default capacity is 4096, choose N large enough so we force it to use |
|
scroggo
2015/04/28 17:27:40
Knowing*
reed2
2015/04/29 00:43:49
Done.
|
| + // multiple buffers internally. |
| + const int N = 1000; |
| + SkROBuffer* readers[N]; |
| + SkStream* streams[N]; |
| + |
| + { |
| + SkRWBuffer buffer; |
| + for (int i = 0; i < N; ++i) { |
| + if (i & 1) { |
|
scroggo
2015/04/28 17:27:40
SkToBool?
reed2
2015/04/29 00:43:49
Acknowledged.
|
| + buffer.append(gABC, 26); |
| + } else { |
| + memcpy(buffer.append(26), gABC, 26); |
| + } |
| + readers[i] = buffer.newRBufferSnapshot(); |
| + streams[i] = buffer.newStreamSnapshot(); |
| + } |
| + REPORTER_ASSERT(reporter, N*26 == buffer.size()); |
| + } |
| + |
| + for (int i = 0; i < N; ++i) { |
| + REPORTER_ASSERT(reporter, (i + 1) * 26U == readers[i]->size()); |
| + check_alphabet_buffer(reporter, readers[i]); |
| + check_alphabet_stream(reporter, streams[i]); |
| + readers[i]->unref(); |
| + SkDELETE(streams[i]); |
| + } |
| +} |