15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/test/gfx_util.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <iomanip>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <sstream>
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string>
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/box_f.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/point.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/point3_f.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/point_f.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/quad_f.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/rect.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/rect_f.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/size.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/size_f.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/vector2d.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/vector2d_f.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/vector3d_f.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/transform.h"
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace gfx {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string ColorAsString(SkColor color) {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::ostringstream stream;
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  stream << std::hex << std::uppercase << "#" << std::setfill('0')
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         << std::setw(2) << SkColorGetA(color)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         << std::setw(2) << SkColorGetR(color)
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         << std::setw(2) << SkColorGetG(color)
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         << std::setw(2) << SkColorGetB(color);
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return stream.str();
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool FloatAlmostEqual(float a, float b) {
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // FloatLE is the gtest predicate for less than or almost equal to.
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ::testing::FloatLE("a", "b", a, b) &&
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         ::testing::FloatLE("b", "a", b, a);
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)::testing::AssertionResult AssertBoxFloatEqual(const char* lhs_expr,
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               const char* rhs_expr,
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               const BoxF& lhs,
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               const BoxF& rhs) {
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (FloatAlmostEqual(lhs.x(), rhs.x()) &&
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FloatAlmostEqual(lhs.y(), rhs.y()) &&
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FloatAlmostEqual(lhs.z(), rhs.z()) &&
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FloatAlmostEqual(lhs.width(), rhs.width()) &&
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FloatAlmostEqual(lhs.height(), rhs.height()) &&
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FloatAlmostEqual(lhs.depth(), rhs.depth())) {
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return ::testing::AssertionSuccess();
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ::testing::AssertionFailure() << "Value of: " << rhs_expr
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       << "\n  Actual: " << rhs.ToString()
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       << "\nExpected: " << lhs_expr
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       << "\nWhich is: " << lhs.ToString();
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch::testing::AssertionResult AssertRectFloatEqual(const char* lhs_expr,
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                const char* rhs_expr,
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                const RectF& lhs,
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                const RectF& rhs) {
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (FloatAlmostEqual(lhs.x(), rhs.x()) &&
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FloatAlmostEqual(lhs.y(), rhs.y()) &&
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FloatAlmostEqual(lhs.width(), rhs.width()) &&
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FloatAlmostEqual(lhs.height(), rhs.height())) {
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return ::testing::AssertionSuccess();
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ::testing::AssertionFailure()
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         << "Value of: " << rhs_expr << "\n  Actual: " << rhs.ToString()
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         << "\nExpected: " << lhs_expr << "\nWhich is: " << lhs.ToString();
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)::testing::AssertionResult AssertSkColorsEqual(const char* lhs_expr,
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               const char* rhs_expr,
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               SkColor lhs,
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               SkColor rhs) {
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (lhs == rhs) {
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return ::testing::AssertionSuccess();
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ::testing::AssertionFailure() << "Value of: " << rhs_expr
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       << "\n  Actual: " << ColorAsString(rhs)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       << "\nExpected: " << lhs_expr
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       << "\nWhich is: " << ColorAsString(lhs);
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const BoxF& box, ::std::ostream* os) {
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << box.ToString();
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const Point& point, ::std::ostream* os) {
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << point.ToString();
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const Point3F& point, ::std::ostream* os) {
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << point.ToString();
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const PointF& point, ::std::ostream* os) {
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << point.ToString();
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const QuadF& quad, ::std::ostream* os) {
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << quad.ToString();
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const Rect& rect, ::std::ostream* os) {
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << rect.ToString();
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const RectF& rect, ::std::ostream* os) {
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << rect.ToString();
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const Size& size, ::std::ostream* os) {
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << size.ToString();
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const SizeF& size, ::std::ostream* os) {
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << size.ToString();
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const Transform& transform, ::std::ostream* os) {
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << transform.ToString();
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const Vector2d& vector, ::std::ostream* os) {
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << vector.ToString();
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const Vector2dF& vector, ::std::ostream* os) {
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << vector.ToString();
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintTo(const Vector3dF& vector, ::std::ostream* os) {
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *os << vector.ToString();
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace gfx
146