| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/cocoa/table_row_nsimage_cache.h" | 5 #include "chrome/browser/cocoa/table_row_nsimage_cache.h" |
| 6 | 6 |
| 7 #include "testing/gmock/include/gmock/gmock.h" | |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 8 |
| 10 namespace { | 9 namespace { |
| 11 | 10 |
| 12 using ::testing::Return; | 11 class TestTable : public TableRowNSImageCache::Table { |
| 12 public: |
| 13 | 13 |
| 14 class MockTable : public TableRowNSImageCache::Table { | 14 std::vector<SkBitmap>* rows() { |
| 15 public: | 15 return &rows_; |
| 16 MOCK_CONST_METHOD0(RowCount, int()); | 16 } |
| 17 MOCK_CONST_METHOD1(GetIcon, SkBitmap(int)); | 17 |
| 18 // TableRowNSImageCache::Table overrides. |
| 19 virtual int RowCount() const { |
| 20 return rows_.size(); |
| 21 } |
| 22 virtual SkBitmap GetIcon(int index) const { |
| 23 return rows_[index]; |
| 24 } |
| 25 |
| 26 private: |
| 27 std::vector<SkBitmap> rows_; |
| 18 }; | 28 }; |
| 19 | 29 |
| 20 TEST(TableRowNSImageCacheTest, Basics) { | 30 SkBitmap MakeImage(int width, int height) { |
| 21 SkBitmap first_bitmap; | 31 SkBitmap image; |
| 22 first_bitmap.setConfig(SkBitmap::kARGB_8888_Config, 40, 30); | 32 image.setConfig(SkBitmap::kARGB_8888_Config, width, height); |
| 23 first_bitmap.eraseRGB(255, 0, 0); | 33 ASSERT_TRUE(image.allocPixels()); |
| 24 ASSERT_TRUE(first_bitmap.allocPixels()); | 34 image.eraseRGB(255, 0, 0); |
| 35 return image; |
| 36 } |
| 25 | 37 |
| 26 SkBitmap second_bitmap; | 38 // Define this as a macro so that the original variable names can be used in |
| 27 second_bitmap.setConfig(SkBitmap::kARGB_8888_Config, 20, 10); | 39 // test output. |
| 28 second_bitmap.eraseRGB(0, 255, 0); | 40 #define COMPARE_SK_NS_IMG_SIZES((skia), (cocoa)) \ |
| 29 ASSERT_TRUE(second_bitmap.allocPixels()); | 41 EXPECT_EQ(skia.width(), [cocoa size].width); \ |
| 42 EXPECT_EQ(skia.height(), [cocoa size].height); |
| 30 | 43 |
| 31 MockTable table; | 44 TEST(TableRowNSImageCacheTest, ModelChanged) { |
| 32 | 45 TestTable table; |
| 33 EXPECT_CALL(table, RowCount()).WillRepeatedly(Return(2)); | 46 std::vector<SkBitmap>* rows = table.rows(); |
| 47 rows->push_back(MakeImage(10, 10)); |
| 48 rows->push_back(MakeImage(20, 20)); |
| 49 rows->push_back(MakeImage(30, 30)); |
| 34 TableRowNSImageCache cache(&table); | 50 TableRowNSImageCache cache(&table); |
| 35 | 51 |
| 36 // Check both images are only generated once | 52 NSImage* image0 = cache.GetImageForRow(0); |
| 37 EXPECT_CALL(table, GetIcon(0)).WillOnce(Return(first_bitmap)); | 53 NSImage* image1 = cache.GetImageForRow(1); |
| 38 NSImage* first_image = cache.GetImageForRow(0); | 54 NSImage* image2 = cache.GetImageForRow(2); |
| 39 EXPECT_EQ(40, [first_image size].width); | |
| 40 EXPECT_EQ(30, [first_image size].height); | |
| 41 EXPECT_EQ(first_image, cache.GetImageForRow(0)); | |
| 42 | 55 |
| 43 EXPECT_CALL(table, GetIcon(1)).WillOnce(Return(second_bitmap)); | 56 COMPARE_SK_NS_IMG_SIZES(rows->at(0), image0); |
| 44 NSImage* second_image = cache.GetImageForRow(1); | 57 COMPARE_SK_NS_IMG_SIZES(rows->at(1), image1); |
| 45 EXPECT_EQ(20, [second_image size].width); | 58 COMPARE_SK_NS_IMG_SIZES(rows->at(2), image2); |
| 46 EXPECT_EQ(10, [second_image size].height); | |
| 47 EXPECT_EQ(second_image, cache.GetImageForRow(1)); | |
| 48 | 59 |
| 49 // Check that invalidating the second icon only invalidates the second icon | 60 rows->clear(); |
| 50 cache.OnItemsChanged(/* start =*/1, /* length =*/1); | |
| 51 EXPECT_EQ(first_image, cache.GetImageForRow(0)); | |
| 52 | 61 |
| 53 EXPECT_CALL(table, GetIcon(1)).WillOnce(Return(first_bitmap)); | 62 rows->push_back(MakeImage(15, 15)); |
| 54 NSImage* new_second_image = cache.GetImageForRow(1); | 63 rows->push_back(MakeImage(25, 25)); |
| 55 EXPECT_EQ(40, [new_second_image size].width); | 64 rows->push_back(MakeImage(35, 35)); |
| 56 EXPECT_EQ(30, [new_second_image size].height); | 65 rows->push_back(MakeImage(45, 45)); |
| 57 EXPECT_EQ(new_second_image, cache.GetImageForRow(1)); | 66 |
| 58 EXPECT_NE(new_second_image, second_image); | 67 // Invalidate the entire model. |
| 68 cache.OnModelChanged(); |
| 69 |
| 70 EXPECT_NE(image0, cache.GetImageForRow(0)); |
| 71 image0 = cache.GetImageForRow(0); |
| 72 |
| 73 EXPECT_NE(image1, cache.GetImageForRow(1)); |
| 74 image1 = cache.GetImageForRow(1); |
| 75 |
| 76 EXPECT_NE(image2, cache.GetImageForRow(2)); |
| 77 image2 = cache.GetImageForRow(2); |
| 78 |
| 79 NSImage* image3 = cache.GetImageForRow(3); |
| 80 |
| 81 COMPARE_SK_NS_IMG_SIZES(rows->at(0), image0); |
| 82 COMPARE_SK_NS_IMG_SIZES(rows->at(1), image1); |
| 83 COMPARE_SK_NS_IMG_SIZES(rows->at(2), image2); |
| 84 COMPARE_SK_NS_IMG_SIZES(rows->at(3), image3); |
| 85 } |
| 86 |
| 87 |
| 88 TEST(TableRowNSImageCacheTest, ItemsChanged) { |
| 89 TestTable table; |
| 90 std::vector<SkBitmap>* rows = table.rows(); |
| 91 rows->push_back(MakeImage(10, 10)); |
| 92 rows->push_back(MakeImage(20, 20)); |
| 93 rows->push_back(MakeImage(30, 30)); |
| 94 TableRowNSImageCache cache(&table); |
| 95 |
| 96 NSImage* image0 = cache.GetImageForRow(0); |
| 97 NSImage* image1 = cache.GetImageForRow(1); |
| 98 NSImage* image2 = cache.GetImageForRow(2); |
| 99 |
| 100 COMPARE_SK_NS_IMG_SIZES(rows->at(0), image0); |
| 101 COMPARE_SK_NS_IMG_SIZES(rows->at(1), image1); |
| 102 COMPARE_SK_NS_IMG_SIZES(rows->at(2), image2); |
| 103 |
| 104 // Update the middle image. |
| 105 (*rows)[1] = MakeImage(25, 25); |
| 106 cache.OnItemsChanged(/* start=*/1, /* count=*/1); |
| 107 |
| 108 // Make sure the other items remained the same. |
| 109 EXPECT_EQ(image0, cache.GetImageForRow(0)); |
| 110 EXPECT_EQ(image2, cache.GetImageForRow(2)); |
| 111 |
| 112 image1 = cache.GetImageForRow(1); |
| 113 COMPARE_SK_NS_IMG_SIZES(rows->at(1), image1); |
| 114 |
| 115 // Update more than one image. |
| 116 (*rows)[0] = MakeImage(15, 15); |
| 117 (*rows)[1] = MakeImage(27, 27) |
| 118 EXPECT_EQ(3U, rows->size()); |
| 119 cache.OnItemsChanged(0, 2); |
| 120 |
| 121 image0 = cache.GetImageForRow(0); |
| 122 image1 = cache.GetImageForRow(1); |
| 123 |
| 124 COMPARE_SK_NS_IMG_SIZES(rows->at(0), image0); |
| 125 COMPARE_SK_NS_IMG_SIZES(rows->at(1), image1); |
| 126 } |
| 127 |
| 128 |
| 129 TEST(TableRowNSImageCacheTest, ItemsAdded) { |
| 130 TestTable table; |
| 131 std::vector<SkBitmap>* rows = table.rows(); |
| 132 rows->push_back(MakeImage(10, 10)); |
| 133 rows->push_back(MakeImage(20, 20)); |
| 134 TableRowNSImageCache cache(&table); |
| 135 |
| 136 NSImage* image0 = cache.GetImageForRow(0); |
| 137 NSImage* image1 = cache.GetImageForRow(1); |
| 138 |
| 139 COMPARE_SK_NS_IMG_SIZES(rows->at(0), image0); |
| 140 COMPARE_SK_NS_IMG_SIZES(rows->at(1), image1); |
| 141 |
| 142 // Add an item to the end. |
| 143 rows->push_back(MakeImage(30, 30)); |
| 144 cache.OnItemsAdded(2, 1); |
| 145 |
| 146 // Make sure image 1 stayed the same. |
| 147 EXPECT_EQ(image1, cache.GetImageForRow(1)); |
| 148 COMPARE_SK_NS_IMG_SIZES(rows->at(1), image1); |
| 149 |
| 150 // Check that image 2 got added correctly. |
| 151 NSImage* image2 = cache.GetImageForRow(2); |
| 152 COMPARE_SK_NS_IMG_SIZES(rows->at(2), image2); |
| 153 |
| 154 // Add two items to the begging. |
| 155 rows->insert(rows->begin(), MakeImage(7, 7)); |
| 156 rows->insert(rows->begin(), MakeImage(3, 3)); |
| 157 cache.OnItemsAdded(0, 2); |
| 158 |
| 159 NSImage* image00 = cache.GetImageForRow(0); |
| 160 NSImage* image01 = cache.GetImageForRow(1); |
| 161 |
| 162 COMPARE_SK_NS_IMG_SIZES(rows->at(0), image00); |
| 163 COMPARE_SK_NS_IMG_SIZES(rows->at(1), image01); |
| 164 } |
| 165 |
| 166 |
| 167 TEST(TableRowNSImageCacheTest, ItemsRemoved) { |
| 168 TestTable table; |
| 169 std::vector<SkBitmap>* rows = table.rows(); |
| 170 rows->push_back(MakeImage(10, 10)); |
| 171 rows->push_back(MakeImage(20, 20)); |
| 172 rows->push_back(MakeImage(30, 30)); |
| 173 rows->push_back(MakeImage(40, 40)); |
| 174 rows->push_back(MakeImage(50, 50)); |
| 175 TableRowNSImageCache cache(&table); |
| 176 |
| 177 NSImage* image0 = cache.GetImageForRow(0); |
| 178 NSImage* image1 = cache.GetImageForRow(1); |
| 179 NSImage* image2 = cache.GetImageForRow(2); |
| 180 NSImage* image3 = cache.GetImageForRow(3); |
| 181 NSImage* image4 = cache.GetImageForRow(4); |
| 182 |
| 183 COMPARE_SK_NS_IMG_SIZES(rows->at(0), image0); |
| 184 COMPARE_SK_NS_IMG_SIZES(rows->at(1), image1); |
| 185 COMPARE_SK_NS_IMG_SIZES(rows->at(2), image2); |
| 186 COMPARE_SK_NS_IMG_SIZES(rows->at(3), image3); |
| 187 COMPARE_SK_NS_IMG_SIZES(rows->at(4), image4); |
| 188 |
| 189 rows->erase(rows->begin() + 1, rows->begin() + 4); // [20x20, 50x50) |
| 190 cache.OnItemsRemoved(1, 3); |
| 191 |
| 192 image0 = cache.GetImageForRow(0); |
| 193 image1 = cache.GetImageForRow(1); |
| 194 |
| 195 COMPARE_SK_NS_IMG_SIZES(rows->at(0), image0); |
| 196 COMPARE_SK_NS_IMG_SIZES(rows->at(1), image1); |
| 59 } | 197 } |
| 60 | 198 |
| 61 } // namespace | 199 } // namespace |
| OLD | NEW |