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 "ui/gfx/geometry/safe_integer_conversions.h"
6
7#include <limits>
8
9#include "testing/gtest/include/gtest/gtest.h"
10
11namespace gfx {
12
13TEST(SafeIntegerConversions, ClampToInt) {
14  EXPECT_EQ(0, ClampToInt(std::numeric_limits<float>::quiet_NaN()));
15
16  float max = std::numeric_limits<int>::max();
17  float min = std::numeric_limits<int>::min();
18  float infinity = std::numeric_limits<float>::infinity();
19
20  int int_max = std::numeric_limits<int>::max();
21  int int_min = std::numeric_limits<int>::min();
22
23  EXPECT_EQ(int_max, ClampToInt(infinity));
24  EXPECT_EQ(int_max, ClampToInt(max));
25  EXPECT_EQ(int_max, ClampToInt(max + 100));
26
27  EXPECT_EQ(-100, ClampToInt(-100.5f));
28  EXPECT_EQ(0, ClampToInt(0));
29  EXPECT_EQ(100, ClampToInt(100.5f));
30
31  EXPECT_EQ(int_min, ClampToInt(-infinity));
32  EXPECT_EQ(int_min, ClampToInt(min));
33  EXPECT_EQ(int_min, ClampToInt(min - 100));
34}
35
36TEST(SafeIntegerConversions, ToFlooredInt) {
37  EXPECT_EQ(0, ToFlooredInt(std::numeric_limits<float>::quiet_NaN()));
38
39  float max = std::numeric_limits<int>::max();
40  float min = std::numeric_limits<int>::min();
41  float infinity = std::numeric_limits<float>::infinity();
42
43  int int_max = std::numeric_limits<int>::max();
44  int int_min = std::numeric_limits<int>::min();
45
46  EXPECT_EQ(int_max, ToFlooredInt(infinity));
47  EXPECT_EQ(int_max, ToFlooredInt(max));
48  EXPECT_EQ(int_max, ToFlooredInt(max + 100));
49
50  EXPECT_EQ(-101, ToFlooredInt(-100.5f));
51  EXPECT_EQ(0, ToFlooredInt(0));
52  EXPECT_EQ(100, ToFlooredInt(100.5f));
53
54  EXPECT_EQ(int_min, ToFlooredInt(-infinity));
55  EXPECT_EQ(int_min, ToFlooredInt(min));
56  EXPECT_EQ(int_min, ToFlooredInt(min - 100));
57}
58
59TEST(SafeIntegerConversions, ToCeiledInt) {
60  EXPECT_EQ(0, ToCeiledInt(std::numeric_limits<float>::quiet_NaN()));
61
62  float max = std::numeric_limits<int>::max();
63  float min = std::numeric_limits<int>::min();
64  float infinity = std::numeric_limits<float>::infinity();
65
66  int int_max = std::numeric_limits<int>::max();
67  int int_min = std::numeric_limits<int>::min();
68
69  EXPECT_EQ(int_max, ToCeiledInt(infinity));
70  EXPECT_EQ(int_max, ToCeiledInt(max));
71  EXPECT_EQ(int_max, ToCeiledInt(max + 100));
72
73  EXPECT_EQ(-100, ToCeiledInt(-100.5f));
74  EXPECT_EQ(0, ToCeiledInt(0));
75  EXPECT_EQ(101, ToCeiledInt(100.5f));
76
77  EXPECT_EQ(int_min, ToCeiledInt(-infinity));
78  EXPECT_EQ(int_min, ToCeiledInt(min));
79  EXPECT_EQ(int_min, ToCeiledInt(min - 100));
80}
81
82TEST(SafeIntegerConversions, ToRoundedInt) {
83  EXPECT_EQ(0, ToRoundedInt(std::numeric_limits<float>::quiet_NaN()));
84
85  float max = std::numeric_limits<int>::max();
86  float min = std::numeric_limits<int>::min();
87  float infinity = std::numeric_limits<float>::infinity();
88
89  int int_max = std::numeric_limits<int>::max();
90  int int_min = std::numeric_limits<int>::min();
91
92  EXPECT_EQ(int_max, ToRoundedInt(infinity));
93  EXPECT_EQ(int_max, ToRoundedInt(max));
94  EXPECT_EQ(int_max, ToRoundedInt(max + 100));
95
96  EXPECT_EQ(-100, ToRoundedInt(-100.1f));
97  EXPECT_EQ(-101, ToRoundedInt(-100.5f));
98  EXPECT_EQ(-101, ToRoundedInt(-100.9f));
99  EXPECT_EQ(0, ToRoundedInt(0));
100  EXPECT_EQ(100, ToRoundedInt(100.1f));
101  EXPECT_EQ(101, ToRoundedInt(100.5f));
102  EXPECT_EQ(101, ToRoundedInt(100.9f));
103
104  EXPECT_EQ(int_min, ToRoundedInt(-infinity));
105  EXPECT_EQ(int_min, ToRoundedInt(min));
106  EXPECT_EQ(int_min, ToRoundedInt(min - 100));
107}
108
109}  // namespace gfx
110