diff --git a/CMakeLists.txt b/CMakeLists.txt index 0fec084..fcd9c3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -132,6 +132,10 @@ IF(BUILD_TESTING) target_link_libraries(functor_cast_test ${LIBS}) add_test(NAME Functor_Cast_Test COMMAND functor_cast_test) + add_executable(boxed_cast_test unittests/boxed_cast_test.cpp) + target_link_libraries(boxed_cast_test ${LIBS}) + add_test(NAME Boxed_Cast_Test COMMAND boxed_cast_test) + add_library(test_module MODULE src/test_module.cpp) target_link_libraries(test_module ${LIBS}) diff --git a/include/chaiscript/dispatchkit/bad_boxed_cast.hpp b/include/chaiscript/dispatchkit/bad_boxed_cast.hpp index 79450e5..c18aa64 100644 --- a/include/chaiscript/dispatchkit/bad_boxed_cast.hpp +++ b/include/chaiscript/dispatchkit/bad_boxed_cast.hpp @@ -37,7 +37,7 @@ namespace chaiscript virtual ~bad_boxed_cast() throw() {} - virtual const char * what () throw() + virtual const char * what() const throw() { return m_what.c_str(); } diff --git a/unittests/boxed_cast_test.cpp b/unittests/boxed_cast_test.cpp new file mode 100644 index 0000000..d0b46cb --- /dev/null +++ b/unittests/boxed_cast_test.cpp @@ -0,0 +1,131 @@ +#include + + +using namespace chaiscript; + + +template +void use(T){} + +template +bool run_test_type_conversion(const Boxed_Value &bv, bool expectedpass) +{ + try { + To ret = chaiscript::boxed_cast(bv); + use(ret); + } catch (const chaiscript::bad_boxed_cast &e) { + if (expectedpass) { + std::cerr << "Failure in run_test_type_conversion: " << e.what() << std::endl; + return false; + } else { + return true; + } + } catch (const std::exception &e) { + std::cerr << "Unexpected standard exception when attempting cast_conversion: " << e.what() << std::endl; + return false; + } catch (...) { + std::cerr << "Unexpected unknown exception when attempting cast_conversion." << std::endl; + return false; + } + + if (expectedpass) + { + return true; + } else { + return false; + } +} + +template +bool test_type_conversion(const Boxed_Value &bv, bool expectedpass) +{ + bool ret = run_test_type_conversion(bv, expectedpass); + + if (!ret) + { + std::cerr << "Error with type conversion test. From: " << bv.get_type_info().name() << " To: " << typeid(To).name() + << " test was expected to " << ((expectedpass)?(std::string("succeed")):(std::string("fail"))) << " but did not" << std::endl; + } + + return ret; +} + +template +bool do_test(const Boxed_Value &bv, bool T, bool ConstT, bool TRef, bool ConstTRef, bool TPtr, bool ConstTPtr, bool TPtrConst, + bool ConstTPtrConst, bool SharedPtrT, bool SharedConstPtrT, + bool ConstSharedPtrT, bool ConstSharedConstPtrT, bool ConstSharedPtrTRef, bool ConstSharedPtrTConstRef, + bool BoostRef, bool BoostConstRef, bool ConstBoostRef, bool ConstBoostConstRef, + bool ConstBoostRefRef, bool ConstBoostConstRefRef, bool PODValue, + bool ConstPODValue, bool PODValueRef, bool ConstPODValueRef) +{ + bool passed = true; + passed &= test_type_conversion(bv, T); + passed &= test_type_conversion(bv, ConstT); + passed &= test_type_conversion(bv, TRef); + passed &= test_type_conversion(bv, ConstTRef); + passed &= test_type_conversion(bv, TPtr); + passed &= test_type_conversion(bv, ConstTPtr); + passed &= test_type_conversion(bv, TPtrConst); + passed &= test_type_conversion(bv, ConstTPtrConst); + passed &= test_type_conversion >(bv, SharedPtrT); + passed &= test_type_conversion >(bv, SharedConstPtrT); + passed &= test_type_conversion &>(bv, false); + passed &= test_type_conversion &>(bv, false); + passed &= test_type_conversion >(bv, ConstSharedPtrT); + passed &= test_type_conversion >(bv, ConstSharedConstPtrT); + passed &= test_type_conversion &>(bv, ConstSharedPtrTRef); + passed &= test_type_conversion &>(bv, ConstSharedPtrTConstRef); +// passed &= test_type_conversion >(bv, BoostRef); +// passed &= test_type_conversion >(bv, BoostConstRef); + passed &= test_type_conversion &>(bv, false); + passed &= test_type_conversion &>(bv, false); + passed &= test_type_conversion >(bv, ConstBoostRef); + passed &= test_type_conversion >(bv, ConstBoostConstRef); + passed &= test_type_conversion &>(bv, ConstBoostRefRef); + passed &= test_type_conversion &>(bv, ConstBoostConstRefRef); + passed &= test_type_conversion(bv, PODValue); + passed &= test_type_conversion(bv, ConstPODValue); + passed &= test_type_conversion(bv, PODValueRef); + passed &= test_type_conversion(bv, ConstPODValueRef); + passed &= test_type_conversion(bv, false); + passed &= test_type_conversion(bv, false); + passed &= test_type_conversion(bv, false); + passed &= test_type_conversion(bv, false); + passed &= test_type_conversion(bv, false); + passed &= test_type_conversion(bv, false); + passed &= test_type_conversion(bv, false); + passed &= test_type_conversion(bv, false); + + return passed; +} + + + +int main() +{ + bool passed = true; + + int i; + /* + bool T, bool ConstT, bool TRef, bool ConstTRef, bool TPtr, + bool ConstTPtr, bool TPtrConst, bool ConstTPtrConst, bool SharedPtrT, bool SharedConstPtrT, + bool ConstSharedPtrT, bool ConstSharedConstPtrT, bool ConstSharedPtrTRef, bool ConstSharedPtrTConstRef, bool BoostRef, + bool BoostConstRef, bool ConstBoostRef, bool ConstBoostConstRef, bool ConstBoostRefRef, bool ConstBoostConstRefRef, + bool PODValue, bool ConstPODValue, bool PODValueRef, bool ConstPODValueRef + */ + + passed &= do_test(var(i), true, true, true, true, true, + true, true, true, true, true, + true, true, true, true, true, + true, true, true, true, true, + true, true, true, true); + + + if (passed) + { + return EXIT_SUCCESS; + } else { + return EXIT_FAILURE; + } + +}