Index: tests/DataRefTest.cpp |
diff --git a/tests/DataRefTest.cpp b/tests/DataRefTest.cpp |
index 099e9098cb396a7a12d1d44bfe4c0d26801d9ca9..981ac54fcfcc97ac0300b064e7992df0590fadbe 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) { |
+ // Knowing that the default capacity is 4096, choose N large enough so we force it to use |
+ // multiple buffers internally. |
+ const int N = 1000; |
+ SkROBuffer* readers[N]; |
+ SkStream* streams[N]; |
+ |
+ { |
+ SkRWBuffer buffer; |
+ for (int i = 0; i < N; ++i) { |
+ if (0 == (i & 1)) { |
+ 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]); |
+ } |
+} |