1// Copyright (c) 2012 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 <set>
6
7#include "base/basictypes.h"
8#include "chrome/browser/ui/views/accelerator_table.h"
9#include "testing/gtest/include/gtest/gtest.h"
10#include "ui/events/event_constants.h"
11
12#if defined(USE_ASH)
13#include "ash/accelerators/accelerator_table.h"
14#endif  // USE_ASH
15
16namespace chrome {
17
18namespace {
19
20struct Cmp {
21  bool operator()(const AcceleratorMapping& lhs,
22                  const AcceleratorMapping& rhs) const {
23    if (lhs.keycode != rhs.keycode)
24      return lhs.keycode < rhs.keycode;
25    return lhs.modifiers < rhs.modifiers;
26    // Do not check |command_id|.
27  }
28};
29
30}  // namespace
31
32TEST(AcceleratorTableTest, CheckDuplicatedAccelerators) {
33  std::set<AcceleratorMapping, Cmp> acclerators;
34  const std::vector<AcceleratorMapping> accelerator_list(GetAcceleratorList());
35  for (std::vector<AcceleratorMapping>::const_iterator it =
36           accelerator_list.begin(); it != accelerator_list.end(); ++it) {
37    const AcceleratorMapping& entry = *it;
38    EXPECT_TRUE(acclerators.insert(entry).second)
39        << "Duplicated accelerator: " << entry.keycode << ", "
40        << (entry.modifiers & ui::EF_SHIFT_DOWN) << ", "
41        << (entry.modifiers & ui::EF_CONTROL_DOWN) << ", "
42        << (entry.modifiers & ui::EF_ALT_DOWN);
43  }
44}
45
46#if defined(OS_CHROMEOS)
47TEST(AcceleratorTableTest, CheckDuplicatedAcceleratorsAsh) {
48  std::set<AcceleratorMapping, Cmp> acclerators;
49  const std::vector<AcceleratorMapping> accelerator_list(GetAcceleratorList());
50  for (std::vector<AcceleratorMapping>::const_iterator it =
51           accelerator_list.begin(); it != accelerator_list.end(); ++it) {
52    const AcceleratorMapping& entry = *it;
53    acclerators.insert(entry);
54  }
55  for (size_t i = 0; i < ash::kAcceleratorDataLength; ++i) {
56    const ash::AcceleratorData& ash_entry = ash::kAcceleratorData[i];
57    if (!ash_entry.trigger_on_press)
58      continue;  // kAcceleratorMap does not have any release accelerators.
59    // The shortcuts to toggle minimized state and to show the task
60    // manager are defined on browser side as well as ash side by
61    // design so that web contents can consume these short cuts. (see
62    // crbug.com/309915, 370019 and CL)
63    if (ash_entry.action == ash::WINDOW_MINIMIZE ||
64        ash_entry.action == ash::SHOW_TASK_MANAGER)
65      continue;
66    AcceleratorMapping entry;
67    entry.keycode = ash_entry.keycode;
68    entry.modifiers = ash_entry.modifiers;
69    entry.command_id = 0;  // dummy
70    EXPECT_TRUE(acclerators.insert(entry).second)
71        << "Duplicated accelerator: " << entry.keycode << ", "
72        << (entry.modifiers & ui::EF_SHIFT_DOWN) << ", "
73        << (entry.modifiers & ui::EF_CONTROL_DOWN) << ", "
74        << (entry.modifiers & ui::EF_ALT_DOWN);
75  }
76}
77#endif  // USE_ASH
78
79}  // namespace chrome
80