blob: bfec89d4da587c31de33b40625e266041f0a5efd [file] [log] [blame]
reed@android.com5e5adfd2009-03-07 03:39:23 +00001#include "Test.h"
2#include "SkRandom.h"
3#include "SkStream.h"
reed@google.com8d0b5772011-06-24 13:07:31 +00004#include "SkData.h"
reed@android.com5e5adfd2009-03-07 03:39:23 +00005
6#define MAX_SIZE (256 * 1024)
7
8static void random_fill(SkRandom& rand, void* buffer, size_t size) {
9 char* p = (char*)buffer;
10 char* stop = p + size;
11 while (p < stop) {
12 *p++ = (char)(rand.nextU() >> 8);
13 }
14}
15
16static void test_buffer(skiatest::Reporter* reporter) {
17 SkRandom rand;
18 SkAutoMalloc am(MAX_SIZE * 2);
19 char* storage = (char*)am.get();
20 char* storage2 = storage + MAX_SIZE;
21
22 random_fill(rand, storage, MAX_SIZE);
23
24 for (int sizeTimes = 0; sizeTimes < 100; sizeTimes++) {
25 int size = rand.nextU() % MAX_SIZE;
26 if (size == 0) {
27 size = MAX_SIZE;
28 }
29 for (int times = 0; times < 100; times++) {
30 int bufferSize = 1 + (rand.nextU() & 0xFFFF);
31 SkMemoryStream mstream(storage, size);
32 SkBufferStream bstream(&mstream, bufferSize);
reed@android.com80e39a72009-04-02 16:59:40 +000033
reed@android.com5e5adfd2009-03-07 03:39:23 +000034 int bytesRead = 0;
35 while (bytesRead < size) {
36 int s = 17 + (rand.nextU() & 0xFFFF);
37 int ss = bstream.read(storage2, s);
38 REPORTER_ASSERT(reporter, ss > 0 && ss <= s);
39 REPORTER_ASSERT(reporter, bytesRead + ss <= size);
reed@android.com80e39a72009-04-02 16:59:40 +000040 REPORTER_ASSERT(reporter,
41 memcmp(storage + bytesRead, storage2, ss) == 0);
reed@android.com5e5adfd2009-03-07 03:39:23 +000042 bytesRead += ss;
43 }
44 REPORTER_ASSERT(reporter, bytesRead == size);
45 }
46 }
47}
48
49static void TestRStream(skiatest::Reporter* reporter) {
reed@android.com80e39a72009-04-02 16:59:40 +000050 static const char s[] =
51 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
reed@android.com5e5adfd2009-03-07 03:39:23 +000052 char copy[sizeof(s)];
53 SkRandom rand;
reed@android.com80e39a72009-04-02 16:59:40 +000054
55 for (int i = 0; i < 65; i++) {
reed@android.com5e5adfd2009-03-07 03:39:23 +000056 char* copyPtr = copy;
57 SkMemoryStream mem(s, sizeof(s));
58 SkBufferStream buff(&mem, i);
reed@android.com80e39a72009-04-02 16:59:40 +000059
reed@android.com5e5adfd2009-03-07 03:39:23 +000060 do {
61 copyPtr += buff.read(copyPtr, rand.nextU() & 15);
62 } while (copyPtr < copy + sizeof(s));
63 REPORTER_ASSERT(reporter, copyPtr == copy + sizeof(s));
64 REPORTER_ASSERT(reporter, memcmp(s, copy, sizeof(s)) == 0);
65 }
66 test_buffer(reporter);
67}
68
reed@android.com80e39a72009-04-02 16:59:40 +000069static void TestWStream(skiatest::Reporter* reporter) {
70 SkDynamicMemoryWStream ds;
71 const char s[] = "abcdefghijklmnopqrstuvwxyz";
72 int i;
73 for (i = 0; i < 100; i++) {
74 REPORTER_ASSERT(reporter, ds.write(s, 26));
reed@android.com5e5adfd2009-03-07 03:39:23 +000075 }
reed@android.com80e39a72009-04-02 16:59:40 +000076 REPORTER_ASSERT(reporter, ds.getOffset() == 100 * 26);
77 char* dst = new char[100 * 26 + 1];
78 dst[100*26] = '*';
79 ds.copyTo(dst);
80 REPORTER_ASSERT(reporter, dst[100*26] == '*');
81// char* p = dst;
82 for (i = 0; i < 100; i++) {
83 REPORTER_ASSERT(reporter, memcmp(&dst[i * 26], s, 26) == 0);
reed@android.com5e5adfd2009-03-07 03:39:23 +000084 }
reed@google.com70442a62011-06-23 21:48:04 +000085
86 {
reed@google.com8d0b5772011-06-24 13:07:31 +000087 SkData* data = ds.copyToData();
reed@google.com70442a62011-06-23 21:48:04 +000088 REPORTER_ASSERT(reporter, 100 * 26 == data->size());
89 REPORTER_ASSERT(reporter, memcmp(dst, data->data(), data->size()) == 0);
90 data->unref();
91 }
reed@android.com80e39a72009-04-02 16:59:40 +000092 delete[] dst;
reed@android.com5e5adfd2009-03-07 03:39:23 +000093}
94
95static void TestStreams(skiatest::Reporter* reporter) {
96 TestRStream(reporter);
97 TestWStream(reporter);
98}
99
100#include "TestClassDef.h"
101DEFINE_TESTCLASS("Stream", StreamTestClass, TestStreams)