diff --git a/tests/CachedDecodingPixelRefTest.cpp b/tests/CachedDecodingPixelRefTest.cpp
index 2d8a0e7..af1df10 100644
--- a/tests/CachedDecodingPixelRefTest.cpp
+++ b/tests/CachedDecodingPixelRefTest.cpp
@@ -12,8 +12,8 @@
 #include "SkForceLinking.h"
 #include "SkImageDecoder.h"
 #include "SkImagePriv.h"
-#include "SkLazyCachingPixelRef.h"
 #include "SkLazyPixelRef.h"
+#include "SkCachingPixelRef.h"
 #include "SkScaledImageCache.h"
 #include "SkStream.h"
 
@@ -109,15 +109,13 @@
 }
 
 
-typedef void(*CompareEncodedToOriginal)(skiatest::Reporter* reporter,
-                                        SkData* encoded,
-                                        const SkBitmap& original,
-                                        bool pixelPerfect);
+typedef bool (*InstallEncoded)(SkData* encoded, SkBitmap* dst);
+
 /**
-   this function tests three differently encoded images against the
-   original bitmap  */
+   This function tests three differently encoded images against the
+   original bitmap */
 static void test_three_encodings(skiatest::Reporter* reporter,
-                                 CompareEncodedToOriginal comp) {
+                                 InstallEncoded install) {
     SkBitmap original;
     make_test_image(&original);
     REPORTER_ASSERT(reporter, !original.empty());
@@ -134,146 +132,67 @@
         SkImageEncoder::Type type = types[i];
         SkAutoDataUnref encoded(create_data_from_bitmap(original, type));
         REPORTER_ASSERT(reporter, encoded.get() != NULL);
-        if (NULL != encoded.get()) {
-            bool comparePixels = (SkImageEncoder::kPNG_Type == type);
-            comp(reporter, encoded, original, comparePixels);
+        if (NULL == encoded.get()) {
+            continue;
         }
+        SkBitmap lazy;
+        bool installSuccess = install(encoded.get(), &lazy);
+        REPORTER_ASSERT(reporter, installSuccess);
+        if (!installSuccess) {
+            continue;
+        }
+        REPORTER_ASSERT(reporter, NULL == lazy.getPixels());
+        {
+            SkAutoLockPixels autoLockPixels(lazy);  // now pixels are good.
+            REPORTER_ASSERT(reporter, NULL != lazy.getPixels());
+            if (NULL == lazy.getPixels()) {
+                continue;
+            }
+        }
+        // pixels should be gone!
+        REPORTER_ASSERT(reporter, NULL == lazy.getPixels());
+        {
+            SkAutoLockPixels autoLockPixels(lazy);  // now pixels are good.
+            REPORTER_ASSERT(reporter, NULL != lazy.getPixels());
+            if (NULL == lazy.getPixels()) {
+                continue;
+            }
+        }
+        bool comparePixels = (SkImageEncoder::kPNG_Type == type);
+        compare_bitmaps(reporter, original, lazy, comparePixels);
     }
 }
 
+
+////////////////////////////////////////////////////////////////////////////////
 /**
  *  This checks to see that a SkLazyPixelRef works as advertised.
  */
-static void compare_with_skLazyPixelRef(skiatest::Reporter* reporter,
-                                        SkData* encoded,
-                                        const SkBitmap& original,
-                                        bool comparePixels) {
-    SkBitmap lazy;
+bool install_skLazyPixelRef(SkData* encoded, SkBitmap* dst) {
     static const SkBitmapFactory::DecodeProc decoder =
         &(SkImageDecoder::DecodeMemoryToTarget);
-    bool success = simple_bitmap_factory(decoder, encoded, &lazy);
-    REPORTER_ASSERT(reporter, success);
-
-    REPORTER_ASSERT(reporter, NULL == lazy.getPixels());
-    {
-        SkAutoLockPixels autoLockPixels(lazy);  // now pixels are good.
-        REPORTER_ASSERT(reporter, NULL != lazy.getPixels());
-    }
-    // pixels should be gone!
-    REPORTER_ASSERT(reporter, NULL == lazy.getPixels());
-    {
-        SkAutoLockPixels autoLockPixels(lazy);  // now pixels are good.
-        REPORTER_ASSERT(reporter, NULL != lazy.getPixels());
-    }
-    compare_bitmaps(reporter, original, lazy, comparePixels);
+    return simple_bitmap_factory(decoder, encoded, dst);
 }
 DEF_TEST(LazyPixelRef, reporter) {
-    test_three_encodings(reporter, compare_with_skLazyPixelRef);
+    test_three_encodings(reporter, install_skLazyPixelRef);
 }
 
-
-
+////////////////////////////////////////////////////////////////////////////////
 /**
- *  This checks to see that a SkLazyCachedPixelRef works as advertised.
+ *  This checks to see that a SkCachingPixelRef works as advertised.
  */
-
-static void compare_with_skLazyCachedPixelRef(skiatest::Reporter* reporter,
-                                              SkData* encoded,
-                                              const SkBitmap& original,
-                                              bool comparePixels) {
-    SkBitmap lazy;
-    static const SkBitmapFactory::DecodeProc decoder =
-        &(SkImageDecoder::DecodeMemoryToTarget);
-    bool success = SkLazyCachingPixelRef::Install(decoder, encoded, &lazy);
-    REPORTER_ASSERT(reporter, success);
-
-    REPORTER_ASSERT(reporter, NULL == lazy.getPixels());
-    {
-        SkAutoLockPixels autoLockPixels(lazy);  // now pixels are good.
-        REPORTER_ASSERT(reporter, NULL != lazy.getPixels());
-    }
-    // pixels should be gone!
-    REPORTER_ASSERT(reporter, NULL == lazy.getPixels());
-    {
-        SkAutoLockPixels autoLockPixels(lazy);  // now pixels are good.
-        REPORTER_ASSERT(reporter, NULL != lazy.getPixels());
-    }
-    compare_bitmaps(reporter, original, lazy, comparePixels);
+bool install_skCachingPixelRef(SkData* encoded, SkBitmap* dst) {
+    return SkCachingPixelRef::Install(
+        SkNEW_ARGS(SkDecodingImageGenerator, (encoded)), dst);
 }
-DEF_TEST(LazyCachedPixelRef, reporter) {
-    test_three_encodings(reporter, compare_with_skLazyCachedPixelRef);
-}
-
-class TestPixelRef : public SkCachingPixelRef {
-public:
-    TestPixelRef(int x) : fX(x) { }
-    virtual ~TestPixelRef() { }
-    static bool Install(SkBitmap* destination, int x) {
-        SkAutoTUnref<TestPixelRef> ref(SkNEW_ARGS(TestPixelRef, (x)));
-        return ref->configure(destination) && destination->setPixelRef(ref);
-    }
-    SK_DECLARE_UNFLATTENABLE_OBJECT()
-protected:
-    virtual bool onDecodeInfo(SkImageInfo* info) SK_OVERRIDE {
-        if (fX == 0) {
-            return false;
-        }
-        SkASSERT(info);
-        info->fWidth = 10;
-        info->fHeight = 10;
-        info->fColorType = kRGBA_8888_SkColorType;
-        info->fAlphaType = kOpaque_SkAlphaType;
-        return true;
-    }
-    virtual bool onDecodePixels(const SkImageInfo& info,
-                                void* pixels,
-                                size_t rowBytes) SK_OVERRIDE {
-        return false;
-    }
-private:
-    int fX;  // controls where the failure happens
-    typedef SkCachingPixelRef INHERITED;
-};
-
 DEF_TEST(CachingPixelRef, reporter) {
-    SkBitmap lazy;
-    // test the error handling
-    REPORTER_ASSERT(reporter, !TestPixelRef::Install(&lazy, 0));
-    // onDecodeInfo should succeed, allowing installation
-    REPORTER_ASSERT(reporter, TestPixelRef::Install(&lazy, 1));
-    SkAutoLockPixels autoLockPixels(lazy);  // now pixels are good.
-    // onDecodePixels should fail, so getting pixels will fail.
-    REPORTER_ASSERT(reporter, NULL == lazy.getPixels());
+    test_three_encodings(reporter, install_skCachingPixelRef);
 }
 
-static void compare_with_SkDecodingImageGenerator(skiatest::Reporter* reporter,
-                                                  SkData* encoded,
-                                                  const SkBitmap& original,
-                                                  bool comparePixels) {
-
-    SkBitmap lazy;
-    bool success = SkDecodingImageGenerator::Install(encoded, &lazy);
-    REPORTER_ASSERT(reporter, success);
-    if (!success) {
-        return;
-    }
-
-    REPORTER_ASSERT(reporter, NULL == lazy.getPixels());
-    {
-        SkAutoLockPixels autoLockPixels(lazy);  // now pixels are good.
-        REPORTER_ASSERT(reporter, NULL != lazy.getPixels());
-        if (NULL == lazy.getPixels()) {
-            return;
-        }
-    }
-    // pixels should be gone!
-    REPORTER_ASSERT(reporter, NULL == lazy.getPixels());
-    {
-        SkAutoLockPixels autoLockPixels(lazy);  // now pixels are good.
-        REPORTER_ASSERT(reporter, NULL != lazy.getPixels());
-    }
-    compare_bitmaps(reporter, original, lazy, comparePixels);
-}
+////////////////////////////////////////////////////////////////////////////////
+/**
+ *  This checks to see that a SkDecodingImageGenerator works as advertised.
+ */
 DEF_TEST(DecodingImageGenerator, reporter) {
-    test_three_encodings(reporter, compare_with_SkDecodingImageGenerator);
+    test_three_encodings(reporter, SkDecodingImageGenerator::Install);
 }
