1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/app_list/fast_show_pickler.h"
6#include "testing/gtest/include/gtest/gtest.h"
7#include "third_party/skia/include/core/SkBitmap.h"
8#include "third_party/skia/include/core/SkColorPriv.h"
9#include "ui/app_list/app_list_item.h"
10#include "ui/app_list/app_list_model.h"
11#include "ui/app_list/test/app_list_test_model.h"
12#include "ui/gfx/image/image_skia.h"
13#include "ui/gfx/skia_util.h"
14
15using app_list::AppListItem;
16using app_list::AppListModel;
17
18class AppListModelPicklerUnitTest : public testing::Test {
19 protected:
20  void CheckIsSame(AppListModel* m1, AppListModel* m2) {
21    ASSERT_EQ(m1->top_level_item_list()->item_count(),
22              m2->top_level_item_list()->item_count());
23    for (size_t i = 0; i < m1->top_level_item_list()->item_count(); i++) {
24      ASSERT_EQ(m1->top_level_item_list()->item_at(i)->id(),
25                m2->top_level_item_list()->item_at(i)->id());
26      ASSERT_EQ(m1->top_level_item_list()->item_at(i)->name(),
27                m2->top_level_item_list()->item_at(i)->name());
28      ASSERT_EQ(m1->top_level_item_list()->item_at(i)->short_name(),
29                m2->top_level_item_list()->item_at(i)->short_name());
30      CompareImages(m1->top_level_item_list()->item_at(i)->icon(),
31                    m2->top_level_item_list()->item_at(i)->icon());
32    }
33  }
34
35  void CompareImages(const gfx::ImageSkia& image1,
36                     const gfx::ImageSkia& image2) {
37    std::vector<gfx::ImageSkiaRep> reps1(image1.image_reps());
38    std::vector<gfx::ImageSkiaRep> reps2(image2.image_reps());
39    ASSERT_EQ(reps1.size(), reps2.size());
40    for (size_t i = 0; i < reps1.size(); ++i) {
41      ASSERT_TRUE(
42          gfx::BitmapsAreEqual(reps1[i].sk_bitmap(), reps2[i].sk_bitmap()));
43      ASSERT_EQ(reps1[i].scale(), reps2[i].scale());
44    }
45  }
46
47  scoped_ptr<AppListModel> CopyViaPickle(AppListModel* model) {
48    scoped_ptr<Pickle> pickle(
49        FastShowPickler::PickleAppListModelForFastShow(model));
50    return FastShowPickler::UnpickleAppListModelForFastShow(pickle.get());
51  }
52
53  void DoConsistencyChecks(AppListModel* model) {
54    scoped_ptr<AppListModel> model2(CopyViaPickle(model));
55    AppListModel dest_model;
56    FastShowPickler::CopyOver(model2.get(), &dest_model);
57
58    CheckIsSame(model, model2.get());
59    CheckIsSame(model, &dest_model);
60    CheckIsSame(model2.get(), &dest_model);
61  }
62
63  gfx::ImageSkia MakeImage() {
64    const int kWidth = 10;
65    const int kHeight = 10;
66    SkBitmap bitmap;
67    bitmap.allocN32Pixels(kWidth, kHeight);
68    bitmap.eraseARGB(255, 1, 2, 3);
69    return gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
70  }
71};
72
73TEST_F(AppListModelPicklerUnitTest, EmptyModel) {
74  AppListModel model;
75  DoConsistencyChecks(&model);
76}
77
78TEST_F(AppListModelPicklerUnitTest, OneItem) {
79  AppListModel model;
80  model.AddItem(make_scoped_ptr(new AppListItem("abc")).Pass());
81  DoConsistencyChecks(&model);
82}
83
84TEST_F(AppListModelPicklerUnitTest, TwoItems) {
85  AppListModel model;
86  AppListItem* app1 =
87      model.AddItem(make_scoped_ptr(new AppListItem("abc")).Pass());
88  model.SetItemNameAndShortName(app1, "hello, there", "ht");
89  AppListItem* app2 =
90      model.AddItem(make_scoped_ptr(new AppListItem("abc2")).Pass());
91  model.SetItemNameAndShortName(app2, "hello, there 2", "ht2");
92
93  DoConsistencyChecks(&model);
94}
95
96TEST_F(AppListModelPicklerUnitTest, Images) {
97  AppListModel model;
98  AppListItem* app1 =
99      model.AddItem(make_scoped_ptr(new AppListItem("abc")).Pass());
100  model.SetItemName(app1, "hello, there");
101  app1->SetIcon(MakeImage(), true);
102  AppListItem* app2 =
103      model.AddItem(make_scoped_ptr(new AppListItem("abc2")).Pass());
104  model.SetItemName(app2, "hello, there 2");
105
106  DoConsistencyChecks(&model);
107}
108
109TEST_F(AppListModelPicklerUnitTest, EmptyImage) {
110  AppListModel model;
111  AppListItem* app1 =
112      model.AddItem(make_scoped_ptr(new AppListItem("abc")).Pass());
113  model.SetItemName(app1, "hello, there");
114  app1->SetIcon(gfx::ImageSkia(), true);
115
116  DoConsistencyChecks(&model);
117}
118