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