]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/libs/histogram/test/axis_variable_test.cpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / libs / histogram / test / axis_variable_test.cpp
index ea90a5822a6fee1e69e212482a2300d2999ab764..b4c51ba13630a7b15443943f65b25243ff49d07e 100644 (file)
@@ -20,6 +20,9 @@
 using namespace boost::histogram;
 
 int main() {
+  constexpr auto inf = std::numeric_limits<double>::infinity();
+  constexpr auto nan = std::numeric_limits<double>::quiet_NaN();
+
   BOOST_TEST(std::is_nothrow_move_assignable<axis::variable<>>::value);
   BOOST_TEST(std::is_nothrow_move_constructible<axis::variable<>>::value);
 
@@ -29,6 +32,10 @@ int main() {
     BOOST_TEST_THROWS(axis::variable<>({1.0}), std::invalid_argument);
     BOOST_TEST_THROWS(axis::variable<>({1.0, 1.0}), std::invalid_argument);
     BOOST_TEST_THROWS(axis::variable<>({1.0, -1.0}), std::invalid_argument);
+    BOOST_TEST_THROWS((axis::variable<>{{1.0, 2.0, nan}}), std::invalid_argument);
+    BOOST_TEST_THROWS((axis::variable<>{{1.0, nan, 2.0}}), std::invalid_argument);
+    BOOST_TEST_THROWS((axis::variable<>{{nan, 1.0, 2.0}}), std::invalid_argument);
+    BOOST_TEST_THROWS((axis::variable<>{{inf, inf}}), std::invalid_argument);
   }
 
   // axis::variable
@@ -39,8 +46,8 @@ int main() {
     BOOST_TEST_EQ(static_cast<const axis::variable<>&>(a).metadata(), "foo");
     a.metadata() = "bar";
     BOOST_TEST_EQ(static_cast<const axis::variable<>&>(a).metadata(), "bar");
-    BOOST_TEST_EQ(a.bin(-1).lower(), -std::numeric_limits<double>::infinity());
-    BOOST_TEST_EQ(a.bin(a.size()).upper(), std::numeric_limits<double>::infinity());
+    BOOST_TEST_EQ(a.bin(-1).lower(), -inf);
+    BOOST_TEST_EQ(a.bin(a.size()).upper(), inf);
     BOOST_TEST_EQ(a.value(0), -1);
     BOOST_TEST_EQ(a.value(0.5), -0.5);
     BOOST_TEST_EQ(a.value(1), 0);
@@ -51,9 +58,9 @@ int main() {
     BOOST_TEST_EQ(a.index(0), 1);
     BOOST_TEST_EQ(a.index(1), 2);
     BOOST_TEST_EQ(a.index(10), 2);
-    BOOST_TEST_EQ(a.index(-std::numeric_limits<double>::infinity()), -1);
-    BOOST_TEST_EQ(a.index(std::numeric_limits<double>::infinity()), 2);
-    BOOST_TEST_EQ(a.index(std::numeric_limits<double>::quiet_NaN()), 2);
+    BOOST_TEST_EQ(a.index(-inf), -1);
+    BOOST_TEST_EQ(a.index(inf), 2);
+    BOOST_TEST_EQ(a.index(nan), 2);
 
     BOOST_TEST_EQ(str(a),
                   "variable(-1, 0, 1, metadata=\"bar\", options=underflow | overflow)");
@@ -72,6 +79,29 @@ int main() {
     BOOST_TEST_NE(a, e);
   }
 
+  // infinity values in constructor
+  {
+    axis::variable<> a{{-inf, 1.0, 2.0, inf}};
+    BOOST_TEST_EQ(a.index(-inf), 0);
+    BOOST_TEST_EQ(a.index(0.0), 0);
+    BOOST_TEST_EQ(a.index(1.0), 1);
+    BOOST_TEST_EQ(a.index(2.0), 2);
+    BOOST_TEST_EQ(a.index(inf), 3);
+
+    BOOST_TEST_EQ(a.value(-1), -inf);
+    BOOST_TEST_EQ(a.value(-0.5), -inf);
+    BOOST_TEST_EQ(a.value(0), -inf);
+    BOOST_TEST_EQ(a.value(0.5), -inf);
+    BOOST_TEST_EQ(a.value(1), 1.0);
+    BOOST_TEST_EQ(a.value(1.5), 1.5);
+    BOOST_TEST_EQ(a.value(2), 2.0);
+    BOOST_TEST_EQ(a.value(2.5), inf);
+    BOOST_TEST_EQ(a.value(3), inf);
+    BOOST_TEST_EQ(a.value(4), inf);
+
+    BOOST_TEST_EQ(str(a), "variable(-inf, 1, 2, inf, options=underflow | overflow)");
+  }
+
   // axis::variable circular
   {
     axis::variable<double, axis::null_type, axis::option::circular_t> a{-1, 1, 2};
@@ -114,9 +144,9 @@ int main() {
     BOOST_TEST_EQ(a.size(), 5);
     BOOST_TEST_IS_CLOSE(a.value(0), -10, 1e-9);
 
-    BOOST_TEST_EQ(a.update(-std::numeric_limits<double>::infinity()), pii_t(-1, 0));
-    BOOST_TEST_EQ(a.update(std::numeric_limits<double>::infinity()), pii_t(a.size(), 0));
-    BOOST_TEST_EQ(a.update(std::numeric_limits<double>::quiet_NaN()), pii_t(a.size(), 0));
+    BOOST_TEST_EQ(a.update(-inf), pii_t(-1, 0));
+    BOOST_TEST_EQ(a.update(inf), pii_t(a.size(), 0));
+    BOOST_TEST_EQ(a.update(nan), pii_t(a.size(), 0));
   }
 
   // iterators