1// Copyright 2014 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#ifndef MOJO_SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
6#define MOJO_SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
7
8#include <string>
9#include <vector>
10
11#include "mojo/public/cpp/bindings/array.h"
12#include "mojo/services/public/cpp/view_manager/types.h"
13#include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h"
14#include "ui/gfx/rect.h"
15
16namespace mojo {
17namespace view_manager {
18namespace service {
19
20enum ChangeType {
21  CHANGE_TYPE_CONNECTION_ESTABLISHED,
22  CHANGE_TYPE_ROOTS_ADDED,
23  CHANGE_TYPE_SERVER_CHANGE_ID_ADVANCED,
24  CHANGE_TYPE_NODE_BOUNDS_CHANGED,
25  CHANGE_TYPE_NODE_HIERARCHY_CHANGED,
26  CHANGE_TYPE_NODE_REORDERED,
27  CHANGE_TYPE_NODE_DELETED,
28  CHANGE_TYPE_VIEW_DELETED,
29  CHANGE_TYPE_VIEW_REPLACED,
30  CHANGE_TYPE_INPUT_EVENT,
31};
32
33// TODO(sky): consider nuking and converting directly to NodeData.
34struct TestNode {
35  // Returns a string description of this.
36  std::string ToString() const;
37
38  Id parent_id;
39  Id node_id;
40  Id view_id;
41};
42
43// Tracks a call to ViewManagerClient. See the individual functions for the
44// fields that are used.
45struct Change {
46  Change();
47  ~Change();
48
49  ChangeType type;
50  ConnectionSpecificId connection_id;
51  Id change_id;
52  std::vector<TestNode> nodes;
53  Id node_id;
54  Id node_id2;
55  Id node_id3;
56  Id view_id;
57  Id view_id2;
58  gfx::Rect bounds;
59  gfx::Rect bounds2;
60  int32 event_action;
61  String creator_url;
62  OrderDirection direction;
63};
64
65// Converts Changes to string descriptions.
66std::vector<std::string> ChangesToDescription1(
67    const std::vector<Change>& changes);
68
69// Returns a string description of |changes[0].nodes|. Returns an empty string
70// if change.size() != 1.
71std::string ChangeNodeDescription(const std::vector<Change>& changes);
72
73// Converts NodeDatas to TestNodes.
74void NodeDatasToTestNodes(const Array<NodeDataPtr>& data,
75                          std::vector<TestNode>* test_nodes);
76
77// TestChangeTracker is used to record ViewManagerClient functions. It notifies
78// a delegate any time a change is added.
79class TestChangeTracker {
80 public:
81  // Used to notify the delegate when a change is added. A change corresponds to
82  // a single ViewManagerClient function.
83  class Delegate {
84   public:
85    virtual void OnChangeAdded() = 0;
86
87   protected:
88    virtual ~Delegate() {}
89  };
90
91  TestChangeTracker();
92  ~TestChangeTracker();
93
94  void set_delegate(Delegate* delegate) { delegate_ = delegate; }
95
96  std::vector<Change>* changes() { return &changes_; }
97
98  // Each of these functions generate a Change. There is one per
99  // ViewManagerClient function.
100  void OnViewManagerConnectionEstablished(ConnectionSpecificId connection_id,
101                                          const String& creator_url,
102                                          Id next_server_change_id,
103                                          Array<NodeDataPtr> nodes);
104  void OnRootsAdded(Array<NodeDataPtr> nodes);
105  void OnServerChangeIdAdvanced(Id change_id);
106  void OnNodeBoundsChanged(Id node_id, RectPtr old_bounds, RectPtr new_bounds);
107  void OnNodeHierarchyChanged(Id node_id,
108                              Id new_parent_id,
109                              Id old_parent_id,
110                              Id server_change_id,
111                              Array<NodeDataPtr> nodes);
112  void OnNodeReordered(Id node_id,
113                       Id relative_node_id,
114                       OrderDirection direction,
115                       Id server_change_id);
116  void OnNodeDeleted(Id node_id, Id server_change_id);
117  void OnViewDeleted(Id view_id);
118  void OnNodeViewReplaced(Id node_id, Id new_view_id, Id old_view_id);
119  void OnViewInputEvent(Id view_id, EventPtr event);
120
121 private:
122  void AddChange(const Change& change);
123
124  Delegate* delegate_;
125  std::vector<Change> changes_;
126
127  DISALLOW_COPY_AND_ASSIGN(TestChangeTracker);
128};
129
130}  // namespace service
131}  // namespace view_manager
132}  // namespace mojo
133
134#endif  // MOJO_SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
135