| Index: ui/events/test/motion_event_test_utils.cc | 
| diff --git a/ui/events/test/motion_event_test_utils.cc b/ui/events/test/motion_event_test_utils.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..7ddc5b5607d9310eeb96f08a0521429f3d2e3b97 | 
| --- /dev/null | 
| +++ b/ui/events/test/motion_event_test_utils.cc | 
| @@ -0,0 +1,72 @@ | 
| +// Copyright 2014 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "ui/events/test/motion_event_test_utils.h" | 
| + | 
| +#include <sstream> | 
| + | 
| +#include "ui/events/gesture_detection/bitset_32.h" | 
| +#include "ui/events/gesture_detection/motion_event.h" | 
| + | 
| +namespace ui { | 
| + | 
| +bool operator==(const MotionEvent& lhs, const MotionEvent& rhs) { | 
| +  // Re-using the string conversion for equality testing is sensible because it | 
| +  // 1) is only used in testing (where performance is not a chief concern), and | 
| +  // 2) simplifies maintenance by consolidating the necessary property checks. | 
| +  std::stringstream lhs_ss, rhs_ss; | 
| +  lhs_ss << lhs; | 
| +  rhs_ss << rhs; | 
| +  return lhs_ss.str() == rhs_ss.str(); | 
| +} | 
| + | 
| +std::ostream& operator<<(std::ostream& os, const MotionEvent& event) { | 
| +  os << "MotionEvent {" | 
| +     << "\n ID: " << event.GetId() << "\n Action: " << event.GetAction() | 
| +     << "\n ActionIndex: " << event.GetActionIndex() | 
| +     << "\n Flags: " << event.GetFlags() | 
| +     << "\n ButtonState: " << event.GetButtonState() << "\n Pointers: ["; | 
| +  const size_t pointer_count = event.GetPointerCount(); | 
| +  const size_t history_size = event.GetHistorySize(); | 
| + | 
| +  BitSet32 pointer_ids; | 
| +  for (size_t i = 0; i < pointer_count; ++i) { | 
| +    pointer_ids.mark_bit(event.GetPointerId(i)); | 
| + | 
| +    // Print the pointers sorted by id. | 
| +    while (!pointer_ids.is_empty()) { | 
| +      int pi = event.FindPointerIndexOfId(pointer_ids.first_marked_bit()); | 
| +      DCHECK_GE(pi, 0); | 
| +      pointer_ids.clear_first_marked_bit(); | 
| +      os << "{" | 
| +         << "\n  Pos: (" << event.GetX(pi) << ", " << event.GetY(pi) << ")" | 
| +         << "\n  RawPos: (" << event.GetX(pi) << ", " << event.GetY(pi) << ")" | 
| +         << "\n  Size: (" << event.GetTouchMajor(pi) << ", " | 
| +         << event.GetTouchMinor(pi) << ")" | 
| +         << "\n  Orientation: " << event.GetOrientation(pi) | 
| +         << "\n  Pressure: " << event.GetOrientation(pi) | 
| +         << "\n  Tool: " << event.GetToolType(pi); | 
| +      if (history_size) { | 
| +        os << "\n  History: ["; | 
| +        for (size_t h = 0; h < history_size; ++h) { | 
| +          os << "\n   { " << event.GetHistoricalX(pi, h) << ", " | 
| +             << event.GetHistoricalY(pi, h) << ", " | 
| +             << event.GetHistoricalTouchMajor(pi, h) << ", " | 
| +             << event.GetHistoricalEventTime(pi).ToInternalValue() << " }"; | 
| +          if (h + 1 < history_size) | 
| +            os << ","; | 
| +        } | 
| +        os << "\n  ]"; | 
| +      } | 
| +      os << "\n }"; | 
| +      if (i + 1 < pointer_count) | 
| +        os << ", "; | 
| +    } | 
| +    os << "]\n}"; | 
| +  } | 
| + | 
| +  return os; | 
| +} | 
| + | 
| +}  // namespace ui | 
|  |