// Test call_if with false condition and non-void result type. #include "../aux_/oteststream.hpp" #include #include #include #include #include boost::contract::aux::test::oteststream out; struct eq { typedef bool result_type; // Test non-void result type. template result_type operator()(L left, R right) const { return left == right; // Requires operator==. } }; struct x {}; // Doest not have operator==. int main() { std::ostringstream ok; x x1, x2;; out.str(""); out << boost::contract::call_if >( boost::bind(eq(), x1, x1) // Compiler-error... but not called. ).else_([] { return false; }) // Test else. << std::endl; ok.str(""); ok << false << std::endl; BOOST_TEST(out.eq(ok.str())); out.str(""); out << boost::contract::call_if >( boost::bind(eq(), x1, x2) // Compiler-error... but not called. ).else_([] { return true; }) << std::endl; ok.str(""); ok << true << std::endl; BOOST_TEST(out.eq(ok.str())); out.str(""); out << // Test "..._c". boost::contract::call_if_c::value>( boost::bind(eq(), x1, x2) // Compiler-error...but not called. ).else_([] { return true; }) << std::endl; ok.str(""); ok << true << std::endl; BOOST_TEST(out.eq(ok.str())); return boost::report_errors(); }