add BitmapCopyTest. Still need to consider the src==no_config case



git-svn-id: http://skia.googlecode.com/svn/trunk@163 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/BitmapCopyTest.cpp b/tests/BitmapCopyTest.cpp
new file mode 100644
index 0000000..5ec64cf
--- /dev/null
+++ b/tests/BitmapCopyTest.cpp
@@ -0,0 +1,95 @@
+#include "Test.h"
+#include "SkBitmap.h"
+
+static const char* boolStr(bool value) {
+    return value ? "true" : "false";
+}
+
+// these are in the same order as the SkBitmap::Config enum
+static const char* gConfigName[] = {
+    "None", "A1", "A8", "Index8", "565", "4444", "8888", "RLE_Index8"
+};
+
+static void init_src(const SkBitmap& bitmap) {
+    SkAutoLockPixels lock(bitmap);    
+    if (bitmap.getPixels()) {
+        memset(bitmap.getPixels(), 4, bitmap.getSize());
+    }
+}
+
+SkColorTable* init_ctable() {
+    static const SkColor colors[] = {
+        SK_ColorBLACK, SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE
+    };
+    return new SkColorTable(colors, SK_ARRAY_COUNT(colors));
+}
+
+struct Pair {
+    SkBitmap::Config    fConfig;
+    const char*         fValid;
+};
+
+static void TestBitmapCopy(skiatest::Reporter* reporter) {
+    static const Pair gPairs[] = {
+        { SkBitmap::kNo_Config,         "00000000"  },
+        { SkBitmap::kA1_Config,         "01101110"  },
+        { SkBitmap::kA8_Config,         "00101110"  },
+        { SkBitmap::kIndex8_Config,     "00111110"  },
+        { SkBitmap::kRGB_565_Config,    "00101110"  },
+        { SkBitmap::kARGB_4444_Config,  "00101110"  },
+        { SkBitmap::kARGB_8888_Config,  "00101110"  },
+        { SkBitmap::kRLE_Index8_Config, "00000000"  }
+    };
+    
+    const int W = 20;
+    const int H = 33;
+    
+    for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) {
+        for (size_t j = 0; j < SK_ARRAY_COUNT(gPairs); j++) {
+            SkBitmap src, dst;
+            SkColorTable* ct = NULL;
+            
+            src.setConfig(gPairs[i].fConfig, W, H);
+            if (SkBitmap::kIndex8_Config == src.config()) {
+                ct = init_ctable();
+            }
+            src.allocPixels(ct);
+            ct->safeRef();
+
+            init_src(src);
+            bool success = src.copyTo(&dst, gPairs[j].fConfig);
+            bool expected = gPairs[i].fValid[j] != '0';
+            if (success != expected) {
+                SkString str;
+                str.printf("SkBitmap::copyTo from %s to %s. expected %s returned %s",
+                           gConfigName[i], gConfigName[j], boolStr(expected),
+                           boolStr(success));
+                reporter->reportFailed(str);
+            }
+            
+            if (success) {
+                REPORTER_ASSERT(reporter, src.width() == dst.width());
+                REPORTER_ASSERT(reporter, src.height() == dst.height());
+                if (src.config() == dst.config()) {
+                    SkAutoLockPixels srcLock(src);    
+                    SkAutoLockPixels dstLock(dst);
+                    REPORTER_ASSERT(reporter, src.readyToDraw());
+                    REPORTER_ASSERT(reporter, dst.readyToDraw());
+                    const char* srcP = (const char*)src.getAddr(0, 0);
+                    const char* dstP = (const char*)dst.getAddr(0, 0);
+                    REPORTER_ASSERT(reporter, srcP != dstP);
+                    REPORTER_ASSERT(reporter, !memcmp(srcP, dstP,
+                                                      src.getSize()));
+                }
+            } else {
+                // dst should be unchanged from its initial state
+                REPORTER_ASSERT(reporter, dst.config() == SkBitmap::kNo_Config);
+                REPORTER_ASSERT(reporter, dst.width() == 0);
+                REPORTER_ASSERT(reporter, dst.height() == 0);
+            }
+        }
+    }
+}
+
+#include "TestClassDef.h"
+DEFINE_TESTCLASS("BitmapCopy", TestBitmapCopyClass, TestBitmapCopy)