From c67329ffb440c377a1693cefb993a8548fc67436 Mon Sep 17 00:00:00 2001 From: Hans Dembinski Date: Sun, 22 Jul 2018 17:30:49 +0200 Subject: [PATCH] more coverage --- src/python/histogram.cpp | 72 ++++++++++++++------------------------- test/axis_test.cpp | 9 +++-- test/histogram_test.cpp | 1 + test/python_suite_test.py | 26 +++++++++----- 4 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/python/histogram.cpp b/src/python/histogram.cpp index e3549e9c..cc0b8ad2 100644 --- a/src/python/histogram.cpp +++ b/src/python/histogram.cpp @@ -150,10 +150,7 @@ bp::object histogram_init(bp::tuple args, bp::dict kwargs) { bp::object self = args[0]; - if (kwargs) { - PyErr_SetString(PyExc_RuntimeError, "no keyword arguments allowed"); - bp::throw_error_already_set(); - } + if (kwargs) { throw std::invalid_argument("no keyword arguments allowed"); } const unsigned dim = bp::len(args) - 1; @@ -166,7 +163,7 @@ bp::object histogram_init(bp::tuple args, bp::dict kwargs) { axes_appender(pa, axes, success)); if (!success) { std::string msg = "require an axis object, got "; - msg += bp::extract(pa.attr("__class__"))(); + msg += bp::extract(bp::str(pa)); PyErr_SetString(PyExc_TypeError, msg.c_str()); bp::throw_error_already_set(); } @@ -222,17 +219,15 @@ bp::object histogram_fill(bp::tuple args, bp::dict kwargs) { const unsigned dim = nargs - 1; if (dim != self.dim()) { - PyErr_SetString(PyExc_ValueError, - "number of arguments and dimension do not match"); - bp::throw_error_already_set(); + throw std::invalid_argument( + "number of arguments and dimension do not match"); } if (dim > BOOST_HISTOGRAM_AXIS_LIMIT) { - PyErr_SetString(PyExc_RuntimeError, - bh::detail::cat("too many arguments, maximum is ", - BOOST_HISTOGRAM_AXIS_LIMIT) - .c_str()); - bp::throw_error_already_set(); + throw std::invalid_argument( + bh::detail::cat("too many arguments, maximum is ", + BOOST_HISTOGRAM_AXIS_LIMIT) + .c_str()); } fetcher fetch[BOOST_HISTOGRAM_AXIS_LIMIT]; @@ -241,9 +236,7 @@ bp::object histogram_fill(bp::tuple args, bp::dict kwargs) { fetch[d].assign(args[1 + d]); if (fetch[d].n > 0) { if (n > 0 && fetch[d].n != n) { - PyErr_SetString(PyExc_ValueError, - "lengths of sequences do not match"); - bp::throw_error_already_set(); + throw std::invalid_argument("lengths of sequences do not match"); } n = fetch[d].n; } @@ -254,17 +247,15 @@ bp::object histogram_fill(bp::tuple args, bp::dict kwargs) { if (nkwargs > 0) { const bool use_weight = kwargs.has_key("weight"); if (nkwargs > use_weight) { // only one keyword allowed: weight - PyErr_SetString(PyExc_RuntimeError, "only keyword weight allowed"); - bp::throw_error_already_set(); + throw std::invalid_argument("only keyword weight allowed"); } if (use_weight) { fetch_weight.assign(kwargs.get("weight")); if (fetch_weight.n > 0) { if (n > 0 && fetch_weight.n != n) { - PyErr_SetString(PyExc_ValueError, - "length of weight sequence does not match"); - bp::throw_error_already_set(); + throw std::invalid_argument( + "length of weight sequence does not match"); } n = fetch_weight.n; } @@ -300,26 +291,20 @@ bp::object histogram_fill(bp::tuple args, bp::dict kwargs) { bp::object histogram_getitem(const pyhistogram& self, bp::object args) { bp::extract get_int(args); if (get_int.check()) { - if (self.dim() != 1) { - PyErr_SetString(PyExc_RuntimeError, "wrong number of arguments"); - bp::throw_error_already_set(); - } - - return bp::object(self[get_int()]); + if (self.dim() == 1) { return bp::object(self[get_int()]); } + throw std::invalid_argument("wrong number of arguments"); } const unsigned dim = bp::len(args); if (self.dim() != dim) { - PyErr_SetString(PyExc_RuntimeError, "wrong number of arguments"); - bp::throw_error_already_set(); + throw std::invalid_argument("wrong number of arguments"); } if (dim > BOOST_HISTOGRAM_AXIS_LIMIT) { - PyErr_SetString(PyExc_RuntimeError, - bh::detail::cat("too many arguments, maximum is ", - BOOST_HISTOGRAM_AXIS_LIMIT) - .c_str()); - bp::throw_error_already_set(); + throw std::invalid_argument( + bh::detail::cat("too many arguments, maximum is ", + BOOST_HISTOGRAM_AXIS_LIMIT) + .c_str()); } int idx[BOOST_HISTOGRAM_AXIS_LIMIT]; @@ -331,10 +316,7 @@ bp::object histogram_getitem(const pyhistogram& self, bp::object args) { bp::object histogram_at(bp::tuple args, bp::dict kwargs) { const pyhistogram& self = bp::extract(args[0]); - if (kwargs) { - PyErr_SetString(PyExc_RuntimeError, "no keyword arguments allowed"); - bp::throw_error_already_set(); - } + if (kwargs) { throw std::invalid_argument("no keyword arguments allowed"); } bp::object a = args.slice(1, bp::_); return histogram_getitem(self, bp::extract(a)); @@ -346,17 +328,13 @@ bp::object histogram_reduce_to(bp::tuple args, bp::dict kwargs) { const unsigned nargs = bp::len(args) - 1; if (nargs > BOOST_HISTOGRAM_AXIS_LIMIT) { - PyErr_SetString(PyExc_RuntimeError, - bh::detail::cat("too many arguments, maximum is ", - BOOST_HISTOGRAM_AXIS_LIMIT) - .c_str()); - bp::throw_error_already_set(); + throw std::invalid_argument( + bh::detail::cat("too many arguments, maximum is ", + BOOST_HISTOGRAM_AXIS_LIMIT) + .c_str()); } - if (kwargs) { - PyErr_SetString(PyExc_RuntimeError, "no keyword arguments allowed"); - bp::throw_error_already_set(); - } + if (kwargs) { throw std::invalid_argument("no keyword arguments allowed"); } int idx[BOOST_HISTOGRAM_AXIS_LIMIT]; for (auto i = 0u; i < nargs; ++i) idx[i] = bp::extract(args[1 + i]); diff --git a/test/axis_test.cpp b/test/axis_test.cpp index 48c21e04..f581ebb6 100644 --- a/test/axis_test.cpp +++ b/test/axis_test.cpp @@ -229,6 +229,7 @@ int main() { BOOST_TEST_EQ(a.value(0), A); BOOST_TEST_EQ(a.value(1), B); BOOST_TEST_EQ(a.value(2), C); + BOOST_TEST_THROWS(a.value(3), std::out_of_range); } // iterators @@ -299,6 +300,7 @@ int main() { axes.push_back(axis::integer<>(-1, 1, "integer", axis::uoflow::off)); std::ostringstream os; for (const auto& a : axes) { os << a << "\n"; } + os << axes.back()[0]; const std::string ref = "regular(2, -1, 1, label='regular1')\n" "regular_log(2, 1, 10, label='regular2', uoflow=False)\n" @@ -308,7 +310,8 @@ int main() { "variable(-1, 0, 1, label='variable', uoflow=False)\n" "category(0, 1, 2, label='category')\n" "category('A', 'B', label='category2')\n" - "integer(-1, 1, label='integer', uoflow=False)\n"; + "integer(-1, 1, label='integer', uoflow=False)\n" + "[-1, 0)"; BOOST_TEST_EQ(os.str(), ref); } @@ -317,13 +320,15 @@ int main() { enum { A, B, C }; std::vector axes; axes.push_back(axis::regular<>{2, -1, 1}); + axes.push_back(axis::regular( + 2, 1, 4, "", axis::uoflow::on, 0.5)); axes.push_back(axis::circular<>{4}); axes.push_back(axis::variable<>{-1, 0, 1}); axes.push_back(axis::category<>{A, B, C}); axes.push_back(axis::integer<>{-1, 1}); for (const auto& a : axes) { BOOST_TEST(!(a == axis::any_std())); - BOOST_TEST_EQ(a, a); + BOOST_TEST_EQ(a, axis::any_std(a)); } BOOST_TEST_NOT(axes == std::vector()); BOOST_TEST(axes == std::vector(axes)); diff --git a/test/histogram_test.cpp b/test/histogram_test.cpp index 29dc6d9b..d0a7b8fb 100644 --- a/test/histogram_test.cpp +++ b/test/histogram_test.cpp @@ -555,6 +555,7 @@ void run_tests() { Type(), axis::regular<>(3, -1, 1, "r"), axis::circular<>(4, 0.0, 1.0, "p"), axis::regular(3, 1, 100, "lr"), + axis::regular(3, 1, 100, "pr", 0.5), axis::variable<>({0.1, 0.2, 0.3, 0.4, 0.5}, "v"), axis::category<>{A, B, C}, axis::integer<>(0, 2, "i")); a(0.5, 20, 0.1, 0.25, 1, 0); diff --git a/test/python_suite_test.py b/test/python_suite_test.py index 554e8a8f..a2d179a2 100644 --- a/test/python_suite_test.py +++ b/test/python_suite_test.py @@ -447,7 +447,7 @@ class test_histogram(unittest.TestCase): histogram(regular()) with self.assertRaises(TypeError): histogram([integer(-1, 1)]) - with self.assertRaises(RuntimeError): + with self.assertRaises(ValueError): histogram(integer(-1, 1), unknown_keyword="nh") h = histogram(integer(-1, 2)) @@ -480,11 +480,11 @@ class test_histogram(unittest.TestCase): self.assertEqual(hsum(h).value, {False: 6, True: 8}[uoflow]) self.assertEqual(h.axis(0).shape, {False: 3, True: 5}[uoflow]) - with self.assertRaises(RuntimeError): + with self.assertRaises(ValueError): h.at(0, foo=None) - with self.assertRaises(RuntimeError): + with self.assertRaises(ValueError): h.at(0, 1) - with self.assertRaises(RuntimeError): + with self.assertRaises(ValueError): h[0, 1] for get in (lambda h, arg: h.at(arg), @@ -625,10 +625,10 @@ class test_histogram(unittest.TestCase): def test_overflow(self): h = histogram(*[regular(1, 0, 1) for i in range(50)]) - with self.assertRaises(RuntimeError): + with self.assertRaises(ValueError): h(*range(50)) - with self.assertRaises(RuntimeError): + with self.assertRaises(ValueError): h.at(*range(50)).value def test_out_of_range(self): @@ -900,9 +900,14 @@ class test_histogram(unittest.TestCase): a(numpy.empty((2, 2))) with self.assertRaises(ValueError): a(numpy.empty(2), 1) + with self.assertRaises(ValueError): + a(numpy.empty(2), numpy.empty(3)) with self.assertRaises(ValueError): a("abc") + with self.assertRaises(ValueError): + a.at(1, 2) + a = histogram(integer(0, 2, uoflow=False), regular(2, 0, 2, uoflow=False)) a(ar(-1, 0, 1), ar(-1., 1., 0.1)) @@ -910,9 +915,12 @@ class test_histogram(unittest.TestCase): self.assertEqual(a.at(0, 1).value, 1) self.assertEqual(a.at(1, 0).value, 1) self.assertEqual(a.at(1, 1).value, 0) + # we don't support: self.assertEqual(a.at([1, 1]).value, 0) with self.assertRaises(ValueError): - a(ar(1, 2, 3)) + a.at(1) + with self.assertRaises(ValueError): + a.at(1, 2, 3) a = histogram(integer(0, 3, uoflow=False)) a(ar(0, 0, 1, 2, 1, 0, 2, 2)) @@ -943,13 +951,13 @@ class test_histogram(unittest.TestCase): self.assertEqual(a.at(1).value, 8) self.assertEqual(a.at(2).value, 6) - with self.assertRaises(RuntimeError): + with self.assertRaises(ValueError): a((1, 2), foo=(1, 1)) with self.assertRaises(ValueError): a((1, 2), weight=(1,)) with self.assertRaises(ValueError): a((1, 2), weight="ab") - with self.assertRaises(RuntimeError): + with self.assertRaises(ValueError): a((1, 2), weight=(1, 1), foo=1) with self.assertRaises(ValueError): a((1, 2), weight=([1, 1], [2, 2]))