Imported Upstream version ceres 1.13.0
[platform/upstream/ceres-solver.git] / internal / ceres / array_utils_test.cc
1 // Ceres Solver - A fast non-linear least squares minimizer
2 // Copyright 2015 Google Inc. All rights reserved.
3 // http://ceres-solver.org/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are met:
7 //
8 // * Redistributions of source code must retain the above copyright notice,
9 //   this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright notice,
11 //   this list of conditions and the following disclaimer in the documentation
12 //   and/or other materials provided with the distribution.
13 // * Neither the name of Google Inc. nor the names of its contributors may be
14 //   used to endorse or promote products derived from this software without
15 //   specific prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 // POSSIBILITY OF SUCH DAMAGE.
28 //
29 // Author: sameeragarwal@google.com (Sameer Agarwal)
30
31 #include "ceres/array_utils.h"
32
33 #include <limits>
34 #include <cmath>
35 #include <vector>
36 #include "gtest/gtest.h"
37
38 namespace ceres {
39 namespace internal {
40
41 using std::vector;
42
43 TEST(ArrayUtils, IsArrayValid) {
44   double x[3];
45   x[0] = 0.0;
46   x[1] = 1.0;
47   x[2] = 2.0;
48   EXPECT_TRUE(IsArrayValid(3, x));
49   x[1] = std::numeric_limits<double>::infinity();
50   EXPECT_FALSE(IsArrayValid(3, x));
51   x[1] = std::numeric_limits<double>::quiet_NaN();
52   EXPECT_FALSE(IsArrayValid(3, x));
53   x[1] = std::numeric_limits<double>::signaling_NaN();
54   EXPECT_FALSE(IsArrayValid(3, x));
55   EXPECT_TRUE(IsArrayValid(1, NULL));
56   InvalidateArray(3, x);
57   EXPECT_FALSE(IsArrayValid(3, x));
58 }
59
60 TEST(ArrayUtils, FindInvalidIndex) {
61   double x[3];
62   x[0] = 0.0;
63   x[1] = 1.0;
64   x[2] = 2.0;
65   EXPECT_EQ(FindInvalidValue(3, x), 3);
66   x[1] = std::numeric_limits<double>::infinity();
67   EXPECT_EQ(FindInvalidValue(3, x), 1);
68   x[1] = std::numeric_limits<double>::quiet_NaN();
69   EXPECT_EQ(FindInvalidValue(3, x), 1);
70   x[1] = std::numeric_limits<double>::signaling_NaN();
71   EXPECT_EQ(FindInvalidValue(3, x), 1);
72   EXPECT_EQ(FindInvalidValue(1, NULL), 1);
73   InvalidateArray(3, x);
74   EXPECT_EQ(FindInvalidValue(3, x), 0);
75 }
76
77 TEST(MapValuesToContiguousRange, ContiguousEntries) {
78   vector<int> array;
79   array.push_back(0);
80   array.push_back(1);
81   vector<int> expected = array;
82   MapValuesToContiguousRange(array.size(), &array[0]);
83   EXPECT_EQ(array, expected);
84   array.clear();
85
86   array.push_back(1);
87   array.push_back(0);
88   expected = array;
89   MapValuesToContiguousRange(array.size(), &array[0]);
90   EXPECT_EQ(array, expected);
91 }
92
93 TEST(MapValuesToContiguousRange, NonContiguousEntries) {
94   vector<int> array;
95   array.push_back(0);
96   array.push_back(2);
97   vector<int> expected;
98   expected.push_back(0);
99   expected.push_back(1);
100   MapValuesToContiguousRange(array.size(), &array[0]);
101   EXPECT_EQ(array, expected);
102 }
103
104 TEST(MapValuesToContiguousRange, NonContiguousRepeatingEntries) {
105   vector<int> array;
106   array.push_back(3);
107   array.push_back(1);
108   array.push_back(0);
109   array.push_back(0);
110   array.push_back(0);
111   array.push_back(5);
112   vector<int> expected;
113   expected.push_back(2);
114   expected.push_back(1);
115   expected.push_back(0);
116   expected.push_back(0);
117   expected.push_back(0);
118   expected.push_back(3);
119   MapValuesToContiguousRange(array.size(), &array[0]);
120   EXPECT_EQ(array, expected);
121 }
122
123 }  // namespace internal
124 }  // namespace ceres