168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/app_list/fast_show_pickler.h" 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "third_party/skia/include/core/SkColorPriv.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/app_list/app_list_item.h" 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/app_list/app_list_model.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/app_list/test/app_list_test_model.h" 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/skia_util.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using app_list::AppListItem; 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)using app_list::AppListModel; 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class AppListModelPicklerUnitTest : public testing::Test { 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) protected: 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void CheckIsSame(AppListModel* m1, AppListModel* m2) { 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(m1->top_level_item_list()->item_count(), 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) m2->top_level_item_list()->item_count()); 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (size_t i = 0; i < m1->top_level_item_list()->item_count(); i++) { 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(m1->top_level_item_list()->item_at(i)->id(), 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) m2->top_level_item_list()->item_at(i)->id()); 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(m1->top_level_item_list()->item_at(i)->name(), 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) m2->top_level_item_list()->item_at(i)->name()); 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(m1->top_level_item_list()->item_at(i)->short_name(), 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) m2->top_level_item_list()->item_at(i)->short_name()); 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CompareImages(m1->top_level_item_list()->item_at(i)->icon(), 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) m2->top_level_item_list()->item_at(i)->icon()); 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void CompareImages(const gfx::ImageSkia& image1, 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const gfx::ImageSkia& image2) { 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::ImageSkiaRep> reps1(image1.image_reps()); 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<gfx::ImageSkiaRep> reps2(image2.image_reps()); 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_EQ(reps1.size(), reps2.size()); 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (size_t i = 0; i < reps1.size(); ++i) { 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE( 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::BitmapsAreEqual(reps1[i].sk_bitmap(), reps2[i].sk_bitmap())); 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_EQ(reps1[i].scale(), reps2[i].scale()); 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<AppListModel> CopyViaPickle(AppListModel* model) { 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<Pickle> pickle( 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FastShowPickler::PickleAppListModelForFastShow(model)); 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return FastShowPickler::UnpickleAppListModelForFastShow(pickle.get()); 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void DoConsistencyChecks(AppListModel* model) { 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<AppListModel> model2(CopyViaPickle(model)); 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AppListModel dest_model; 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FastShowPickler::CopyOver(model2.get(), &dest_model); 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CheckIsSame(model, model2.get()); 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CheckIsSame(model, &dest_model); 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CheckIsSame(model2.get(), &dest_model); 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::ImageSkia MakeImage() { 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const int kWidth = 10; 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const int kHeight = 10; 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SkBitmap bitmap; 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bitmap.allocN32Pixels(kWidth, kHeight); 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bitmap.eraseARGB(255, 1, 2, 3); 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return gfx::ImageSkia::CreateFrom1xBitmap(bitmap); 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(AppListModelPicklerUnitTest, EmptyModel) { 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AppListModel model; 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DoConsistencyChecks(&model); 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(AppListModelPicklerUnitTest, OneItem) { 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AppListModel model; 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model.AddItem(make_scoped_ptr(new AppListItem("abc")).Pass()); 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DoConsistencyChecks(&model); 8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(AppListModelPicklerUnitTest, TwoItems) { 8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AppListModel model; 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AppListItem* app1 = 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model.AddItem(make_scoped_ptr(new AppListItem("abc")).Pass()); 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model.SetItemNameAndShortName(app1, "hello, there", "ht"); 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AppListItem* app2 = 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model.AddItem(make_scoped_ptr(new AppListItem("abc2")).Pass()); 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model.SetItemNameAndShortName(app2, "hello, there 2", "ht2"); 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DoConsistencyChecks(&model); 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(AppListModelPicklerUnitTest, Images) { 9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AppListModel model; 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AppListItem* app1 = 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model.AddItem(make_scoped_ptr(new AppListItem("abc")).Pass()); 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model.SetItemName(app1, "hello, there"); 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) app1->SetIcon(MakeImage(), true); 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AppListItem* app2 = 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model.AddItem(make_scoped_ptr(new AppListItem("abc2")).Pass()); 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model.SetItemName(app2, "hello, there 2"); 10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DoConsistencyChecks(&model); 10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(AppListModelPicklerUnitTest, EmptyImage) { 11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AppListModel model; 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AppListItem* app1 = 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model.AddItem(make_scoped_ptr(new AppListItem("abc")).Pass()); 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) model.SetItemName(app1, "hello, there"); 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) app1->SetIcon(gfx::ImageSkia(), true); 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DoConsistencyChecks(&model); 11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 118