/* Boost test/cmp_exn.cpp * test policies with respect to exception throwing * * Copyright 2004 Guillaume Melquiond * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or * copy at http://www.boost.org/LICENSE_1_0.txt) */ #include #include #include #include #include #include struct my_checking { static int nan() { return -1; } static bool is_nan(int x) { return x < 0; } static int empty_lower() { return -1; } static int empty_upper() { return -1; } static bool is_empty(int l, int u) { return l == -1 && u == -1; } }; struct empty_class {}; typedef boost::numeric::interval_lib::policies< empty_class, my_checking > my_policies; typedef boost::numeric::interval I; #define BOOST_C_EXN(e) \ BOOST_CHECK_THROW(e, boost::numeric::interval_lib::comparison_error) static void test_cer() { I const a(I::empty()), b(1,2); int const c = 0, d = my_checking::nan(); using namespace boost::numeric::interval_lib::compare::certain; BOOST_C_EXN(a < b); BOOST_C_EXN(a <= b); BOOST_C_EXN(a > b); BOOST_C_EXN(a >= b); BOOST_C_EXN(a == b); BOOST_C_EXN(a != b); BOOST_C_EXN(b < a); BOOST_C_EXN(b <= a); BOOST_C_EXN(b > a); BOOST_C_EXN(b >= a); BOOST_C_EXN(b == a); BOOST_C_EXN(b != a); BOOST_C_EXN(a < c); BOOST_C_EXN(a <= c); BOOST_C_EXN(a > c); BOOST_C_EXN(a >= c); BOOST_C_EXN(a == c); BOOST_C_EXN(a != c); BOOST_C_EXN(b < d); BOOST_C_EXN(b <= d); BOOST_C_EXN(b > d); BOOST_C_EXN(b >= d); BOOST_C_EXN(b == d); BOOST_C_EXN(b != d); } static void test_def() { I const a(I::empty()), b(1,2); int const c = 0, d = my_checking::nan(); BOOST_C_EXN(a < b); BOOST_C_EXN(a <= b); BOOST_C_EXN(a > b); BOOST_C_EXN(a >= b); BOOST_C_EXN(a == b); BOOST_C_EXN(a != b); BOOST_C_EXN(b < a); BOOST_C_EXN(b <= a); BOOST_C_EXN(b > a); BOOST_C_EXN(b >= a); BOOST_C_EXN(b == a); BOOST_C_EXN(b != a); BOOST_C_EXN(a < c); BOOST_C_EXN(a <= c); BOOST_C_EXN(a > c); BOOST_C_EXN(a >= c); BOOST_C_EXN(a == c); BOOST_C_EXN(a != c); BOOST_C_EXN(b < d); BOOST_C_EXN(b <= d); BOOST_C_EXN(b > d); BOOST_C_EXN(b >= d); BOOST_C_EXN(b == d); BOOST_C_EXN(b != d); } static void test_lex() { I const a(I::empty()), b(1,2); int const c = 0, d = my_checking::nan(); using namespace boost::numeric::interval_lib::compare::lexicographic; BOOST_C_EXN(a < b); BOOST_C_EXN(a <= b); BOOST_C_EXN(a > b); BOOST_C_EXN(a >= b); BOOST_C_EXN(a == b); BOOST_C_EXN(a != b); BOOST_C_EXN(b < a); BOOST_C_EXN(b <= a); BOOST_C_EXN(b > a); BOOST_C_EXN(b >= a); BOOST_C_EXN(b == a); BOOST_C_EXN(b != a); BOOST_C_EXN(a < c); BOOST_C_EXN(a <= c); BOOST_C_EXN(a > c); BOOST_C_EXN(a >= c); BOOST_C_EXN(a == c); BOOST_C_EXN(a != c); BOOST_C_EXN(b < d); BOOST_C_EXN(b <= d); BOOST_C_EXN(b > d); BOOST_C_EXN(b >= d); BOOST_C_EXN(b == d); BOOST_C_EXN(b != d); } static void test_pos() { I const a(I::empty()), b(1,2); int const c = 0, d = my_checking::nan(); using namespace boost::numeric::interval_lib::compare::possible; BOOST_C_EXN(a < b); BOOST_C_EXN(a <= b); BOOST_C_EXN(a > b); BOOST_C_EXN(a >= b); BOOST_C_EXN(a == b); BOOST_C_EXN(a != b); BOOST_C_EXN(b < a); BOOST_C_EXN(b <= a); BOOST_C_EXN(b > a); BOOST_C_EXN(b >= a); BOOST_C_EXN(b == a); BOOST_C_EXN(b != a); BOOST_C_EXN(a < c); BOOST_C_EXN(a <= c); BOOST_C_EXN(a > c); BOOST_C_EXN(a >= c); BOOST_C_EXN(a == c); BOOST_C_EXN(a != c); BOOST_C_EXN(b < d); BOOST_C_EXN(b <= d); BOOST_C_EXN(b > d); BOOST_C_EXN(b >= d); BOOST_C_EXN(b == d); BOOST_C_EXN(b != d); } static void test_set() { I const a(I::empty()), b(1,2); int const c = 0; using namespace boost::numeric::interval_lib::compare::set; BOOST_C_EXN(a < c); BOOST_C_EXN(a <= c); BOOST_C_EXN(a > c); BOOST_C_EXN(a >= c); BOOST_C_EXN(a == c); BOOST_C_EXN(a != c); BOOST_C_EXN(b < c); BOOST_C_EXN(b <= c); BOOST_C_EXN(b > c); BOOST_C_EXN(b >= c); BOOST_C_EXN(b == c); BOOST_C_EXN(b != c); } static void test_tri() { I const a(I::empty()), b(1,2); int const c = 0, d = my_checking::nan(); using namespace boost::numeric::interval_lib::compare::tribool; BOOST_C_EXN(a < b); BOOST_C_EXN(a <= b); BOOST_C_EXN(a > b); BOOST_C_EXN(a >= b); BOOST_C_EXN(a == b); BOOST_C_EXN(a != b); BOOST_C_EXN(b < a); BOOST_C_EXN(b <= a); BOOST_C_EXN(b > a); BOOST_C_EXN(b >= a); BOOST_C_EXN(b == a); BOOST_C_EXN(b != a); BOOST_C_EXN(a < c); BOOST_C_EXN(a <= c); BOOST_C_EXN(a > c); BOOST_C_EXN(a >= c); BOOST_C_EXN(a == c); BOOST_C_EXN(a != c); BOOST_C_EXN(b < d); BOOST_C_EXN(b <= d); BOOST_C_EXN(b > d); BOOST_C_EXN(b >= d); BOOST_C_EXN(b == d); BOOST_C_EXN(b != d); } int test_main(int, char *[]) { test_cer(); test_def(); test_lex(); test_pos(); test_set(); test_tri(); return 0; }