Add a detachAsStream to SkDynamicMemoryWStream.

R=reed@google.com

Committed: https://code.google.com/p/skia/source/detail?r=10171

Review URL: https://codereview.chromium.org/19677002

git-svn-id: http://skia.googlecode.com/svn/trunk@10178 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/StreamTest.cpp b/tests/StreamTest.cpp
index cf82843..1eb1282 100644
--- a/tests/StreamTest.cpp
+++ b/tests/StreamTest.cpp
@@ -32,6 +32,8 @@
     // expect EOF
     size_t bytes = stream->read(tmp, 1);
     REPORTER_ASSERT(reporter, 0 == bytes);
+    // isAtEnd might not return true until after the first failing read.
+    REPORTER_ASSERT(reporter, stream->isAtEnd());
 }
 
 static void test_filestreams(skiatest::Reporter* reporter, const char* tmpDir) {
@@ -81,6 +83,7 @@
         REPORTER_ASSERT(reporter, ds.write(s, 26));
     }
     REPORTER_ASSERT(reporter, ds.getOffset() == 100 * 26);
+
     char* dst = new char[100 * 26 + 1];
     dst[100*26] = '*';
     ds.copyTo(dst);
@@ -90,10 +93,42 @@
     }
 
     {
-        SkData* data = ds.copyToData();
+        SkAutoTUnref<SkStreamAsset> stream(ds.detatchAsStream());
+        REPORTER_ASSERT(reporter, 100 * 26 == stream->getLength());
+        REPORTER_ASSERT(reporter, ds.getOffset() == 0);
+        test_loop_stream(reporter, stream.get(), s, 26, 100);
+
+        SkAutoTUnref<SkStreamAsset> stream2(stream->duplicate());
+        test_loop_stream(reporter, stream2.get(), s, 26, 100);
+
+        SkAutoTUnref<SkStreamAsset> stream3(stream->fork());
+        REPORTER_ASSERT(reporter, stream3->isAtEnd());
+        char tmp;
+        size_t bytes = stream->read(&tmp, 1);
+        REPORTER_ASSERT(reporter, 0 == bytes);
+        stream3->rewind();
+        test_loop_stream(reporter, stream3.get(), s, 26, 100);
+    }
+
+    for (i = 0; i < 100; i++) {
+        REPORTER_ASSERT(reporter, ds.write(s, 26));
+    }
+    REPORTER_ASSERT(reporter, ds.getOffset() == 100 * 26);
+
+    {
+        SkAutoTUnref<SkData> data(ds.copyToData());
         REPORTER_ASSERT(reporter, 100 * 26 == data->size());
         REPORTER_ASSERT(reporter, memcmp(dst, data->data(), data->size()) == 0);
-        data->unref();
+    }
+
+    {
+        // Test that this works after a copyToData.
+        SkAutoTUnref<SkStreamAsset> stream(ds.detatchAsStream());
+        REPORTER_ASSERT(reporter, ds.getOffset() == 0);
+        test_loop_stream(reporter, stream.get(), s, 26, 100);
+
+        SkAutoTUnref<SkStreamAsset> stream2(stream->duplicate());
+        test_loop_stream(reporter, stream2.get(), s, 26, 100);
     }
     delete[] dst;