Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / histogram / test / axis_category_test.cpp
index 397554d..92951a5 100644 (file)
@@ -4,10 +4,12 @@
 // (See accompanying file LICENSE_1_0.txt
 // or copy at http://www.boost.org/LICENSE_1_0.txt)
 
+#include <boost/core/ignore_unused.hpp>
 #include <boost/core/lightweight_test.hpp>
+#include <boost/core/lightweight_test_trait.hpp>
 #include <boost/histogram/axis/category.hpp>
 #include <boost/histogram/axis/ostream.hpp>
-#include <boost/histogram/detail/cat.hpp>
+#include <boost/histogram/axis/traits.hpp>
 #include <limits>
 #include <sstream>
 #include <string>
 #include "std_ostream.hpp"
 #include "throw_exception.hpp"
 #include "utility_axis.hpp"
-
-using namespace boost::histogram;
+#include "utility_str.hpp"
 
 int main() {
+  using namespace boost::histogram;
+
+  BOOST_TEST(std::is_nothrow_move_constructible<axis::category<int>>::value);
+  BOOST_TEST(std::is_nothrow_move_constructible<axis::category<std::string>>::value);
   BOOST_TEST(std::is_nothrow_move_assignable<axis::category<int>>::value);
   BOOST_TEST(std::is_nothrow_move_assignable<axis::category<std::string>>::value);
 
-  // bad_ctors
+  // bad ctor
+  {
+    int x[2];
+    boost::ignore_unused(x);
+    BOOST_TEST_THROWS(axis::category<int>(x + 1, x), std::invalid_argument);
+  }
+
+  // value should return copy for arithmetic types and const reference otherwise
+  {
+    enum class Foo { foo };
+
+    BOOST_TEST_TRAIT_SAME(axis::traits::value_type<axis::category<std::string>>,
+                          std::string);
+    BOOST_TEST_TRAIT_SAME(decltype(std::declval<axis::category<std::string>>().value(0)),
+                          const std::string&);
+    BOOST_TEST_TRAIT_SAME(axis::traits::value_type<axis::category<const char*>>,
+                          const char*);
+    BOOST_TEST_TRAIT_SAME(decltype(std::declval<axis::category<const char*>>().value(0)),
+                          const char*);
+    BOOST_TEST_TRAIT_SAME(axis::traits::value_type<axis::category<Foo>>, Foo);
+    BOOST_TEST_TRAIT_SAME(decltype(std::declval<axis::category<Foo>>().value(0)), Foo);
+    BOOST_TEST_TRAIT_SAME(axis::traits::value_type<axis::category<int>>, int);
+    BOOST_TEST_TRAIT_SAME(decltype(std::declval<axis::category<int>>().value(0)), int);
+  }
+
+  // empty axis::category
   {
-    auto empty = std::vector<int>(0);
-    BOOST_TEST_THROWS((axis::category<>(empty)), std::invalid_argument);
+    axis::category<int> a;
+    axis::category<int> b(std::vector<int>(0));
+    BOOST_TEST_EQ(a, b);
+    BOOST_TEST_EQ(a.size(), 0);
+    BOOST_TEST_EQ(a.index(-1), 0);
+    BOOST_TEST_EQ(a.index(0), 0);
+    BOOST_TEST_EQ(a.index(1), 0);
   }
 
   // axis::category
@@ -47,20 +82,50 @@ int main() {
     BOOST_TEST_EQ(a.value(2), C);
     BOOST_TEST_THROWS(a.value(3), std::out_of_range);
 
-    BOOST_TEST_EQ(detail::cat(a),
+    BOOST_TEST_EQ(str(a),
                   "category(\"A\", \"B\", \"C\", metadata=\"bar\", options=overflow)");
+  }
+
+  // category<int, axis::null_type>: copy, move
+  {
+    using C = axis::category<int, axis::null_type>;
+    C a({1, 2, 3});
+    C a2(a);
+    BOOST_TEST_EQ(a2, a);
+    C b;
+    BOOST_TEST_NE(a, b);
+    b = a;
+    BOOST_TEST_EQ(a, b);
+    b = C{{2, 1, 3}};
+    BOOST_TEST_NE(a, b);
+    b = a;
+    BOOST_TEST_EQ(a, b);
+    C c = std::move(b);
+    BOOST_TEST_EQ(c, a);
+    C d;
+    BOOST_TEST_NE(c, d);
+    d = std::move(c);
+    BOOST_TEST_EQ(d, a);
+  }
+
+  // category<std::string>: copy, move
+  {
+    using C = axis::category<std::string>;
 
-    axis::category<std::string> b;
+    C a({"A", "B", "C"}, "foo");
+    C a2(a);
+    BOOST_TEST_EQ(a2, a);
+    C b;
     BOOST_TEST_NE(a, b);
     b = a;
     BOOST_TEST_EQ(a, b);
-    b = axis::category<std::string>{{B, A, C}};
+    b = C{{"B", "A", "C"}};
     BOOST_TEST_NE(a, b);
     b = a;
     BOOST_TEST_EQ(a, b);
-    axis::category<std::string> c = std::move(b);
+    C c = std::move(b);
     BOOST_TEST_EQ(c, a);
-    axis::category<std::string> d;
+    C d;
     BOOST_TEST_NE(c, d);
     d = std::move(c);
     BOOST_TEST_EQ(d, a);
@@ -79,7 +144,7 @@ int main() {
     BOOST_TEST_EQ(a.update(10), std::make_pair(2, 0));
     BOOST_TEST_EQ(a.size(), 3);
 
-    BOOST_TEST_EQ(detail::cat(a), "category(5, 1, 10, options=growth)");
+    BOOST_TEST_EQ(str(a), "category(5, 1, 10, options=growth)");
   }
 
   // iterators