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
3// found in the LICENSE file.
4
5#include "base/values.h"
6#include "chrome/browser/extensions/extension_omnibox_api.h"
7#include "testing/gtest/include/gtest/gtest.h"
8#include "testing/platform_test.h"
9
10namespace {
11
12const int kNone = ACMatchClassification::NONE;
13const int kUrl = ACMatchClassification::URL;
14const int kMatch = ACMatchClassification::MATCH;
15const int kDim = ACMatchClassification::DIM;
16
17void AppendStyle(const std::string& type,
18                 int offset, int length,
19                 ListValue* styles) {
20  DictionaryValue* style = new DictionaryValue;
21  style->SetString("type", type);
22  style->SetInteger("offset", offset);
23  style->SetInteger("length", length);
24  styles->Append(style);
25}
26
27void CompareClassification(const ACMatchClassifications& expected,
28                           const ACMatchClassifications& actual) {
29  EXPECT_EQ(expected.size(), actual.size());
30  for (size_t i = 0; i < expected.size() && i < actual.size(); ++i) {
31    EXPECT_EQ(expected[i].offset, actual[i].offset) << "Index:" << i;
32    EXPECT_EQ(expected[i].style, actual[i].style) << "Index:" << i;
33  }
34}
35
36}  // namespace
37
38// Test output key: n = character with no styling, d = dim, m = match, u = url
39// u = 1, m = 2, d = 4. u+d = 5, etc.
40
41//   0123456789
42//    mmmm
43// +       ddd
44// = nmmmmndddn
45TEST(ExtensionOmniboxTest, DescriptionStylesSimple) {
46  ListValue styles_value;
47  AppendStyle("match", 1, 4, &styles_value);
48  AppendStyle("dim", 6, 3, &styles_value);
49
50  ACMatchClassifications styles_expected;
51  styles_expected.push_back(ACMatchClassification(0, kNone));
52  styles_expected.push_back(ACMatchClassification(1, kMatch));
53  styles_expected.push_back(ACMatchClassification(5, kNone));
54  styles_expected.push_back(ACMatchClassification(6, kDim));
55  styles_expected.push_back(ACMatchClassification(9, kNone));
56
57  ExtensionOmniboxSuggestion suggestions;
58  suggestions.description.resize(10);
59  EXPECT_TRUE(suggestions.ReadStylesFromValue(styles_value));
60  CompareClassification(styles_expected, suggestions.description_styles);
61
62  // Same input, but swap the order. Ensure it still works.
63  styles_value.Clear();
64  AppendStyle("dim", 6, 3, &styles_value);
65  AppendStyle("match", 1, 4, &styles_value);
66  EXPECT_TRUE(suggestions.ReadStylesFromValue(styles_value));
67  CompareClassification(styles_expected, suggestions.description_styles);
68}
69
70//   0123456789
71//   uuuuu
72// +          dd
73// +          mm
74// + mmmm
75// +  dd
76// = 3773unnnn66
77TEST(ExtensionOmniboxTest, DescriptionStylesCombine) {
78  ListValue styles_value;
79  AppendStyle("url", 0, 5, &styles_value);
80  AppendStyle("dim", 9, 2, &styles_value);
81  AppendStyle("match", 9, 2, &styles_value);
82  AppendStyle("match", 0, 4, &styles_value);
83  AppendStyle("dim", 1, 2, &styles_value);
84
85  ACMatchClassifications styles_expected;
86  styles_expected.push_back(ACMatchClassification(0, kUrl | kMatch));
87  styles_expected.push_back(ACMatchClassification(1, kUrl | kMatch | kDim));
88  styles_expected.push_back(ACMatchClassification(3, kUrl | kMatch));
89  styles_expected.push_back(ACMatchClassification(4, kUrl));
90  styles_expected.push_back(ACMatchClassification(5, kNone));
91  styles_expected.push_back(ACMatchClassification(9, kMatch | kDim));
92
93  ExtensionOmniboxSuggestion suggestions;
94  suggestions.description.resize(10);
95  EXPECT_TRUE(suggestions.ReadStylesFromValue(styles_value));
96  CompareClassification(styles_expected, suggestions.description_styles);
97
98  // Try moving the "dim/match" style pair at offset 9. Output should be the
99  // same.
100  styles_value.Clear();
101  AppendStyle("url", 0, 5, &styles_value);
102  AppendStyle("match", 0, 4, &styles_value);
103  AppendStyle("dim", 9, 2, &styles_value);
104  AppendStyle("match", 9, 2, &styles_value);
105  AppendStyle("dim", 1, 2, &styles_value);
106  EXPECT_TRUE(suggestions.ReadStylesFromValue(styles_value));
107  CompareClassification(styles_expected, suggestions.description_styles);
108}
109
110//   0123456789
111//   uuuuu
112// + mmmmm
113// + mmm
114// +   ddd
115// + ddd
116// = 77777nnnnn
117TEST(ExtensionOmniboxTest, DescriptionStylesCombine2) {
118  ListValue styles_value;
119  AppendStyle("url", 0, 5, &styles_value);
120  AppendStyle("match", 0, 5, &styles_value);
121  AppendStyle("match", 0, 3, &styles_value);
122  AppendStyle("dim", 2, 3, &styles_value);
123  AppendStyle("dim", 0, 3, &styles_value);
124
125  ACMatchClassifications styles_expected;
126  styles_expected.push_back(ACMatchClassification(0, kUrl | kMatch | kDim));
127  styles_expected.push_back(ACMatchClassification(5, kNone));
128
129  ExtensionOmniboxSuggestion suggestions;
130  suggestions.description.resize(10);
131  EXPECT_TRUE(suggestions.ReadStylesFromValue(styles_value));
132  CompareClassification(styles_expected, suggestions.description_styles);
133}
134