From 0caa782437ae76f1e3982e1136958441980113d0 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Mon, 11 Oct 2010 03:45:45 +0000 Subject: [PATCH] Basic unit tests for casting to **. Storing of (double) pointer types is probably not something we will make an effort to support 100%. Also, tests of all types that are supported. --- unittests/boxed_cast_test.cpp | 223 ++++++++++++++++++++++++++++------ 1 file changed, 187 insertions(+), 36 deletions(-) diff --git a/unittests/boxed_cast_test.cpp b/unittests/boxed_cast_test.cpp index 1efaabe..7436577 100644 --- a/unittests/boxed_cast_test.cpp +++ b/unittests/boxed_cast_test.cpp @@ -105,6 +105,185 @@ bool do_test(const Boxed_Value &bv, bool T, bool ConstT, bool TRef, bool ConstTR return passed; } +/** Tests intended for built int types **/ +template +bool built_in_type_test(const T &initial, bool ispod) +{ + bool passed = true; + + /** value tests **/ + T i = T(initial); + 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, + ispod && true, ispod && true, ispod && true, true, true); + + passed &= do_test(const_var(i), true, true, false, true, false, + true, false, true, false, true, + false, true, false, true, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, false, true); + + passed &= do_test(var(&i), true, true, true, true, true, + true, true, true, false, false, + false, false, false, false, true, + true, true, true, true, true, + ispod && true, ispod && true, ispod && true, true, true); + + passed &= do_test(const_var(&i), true, true, false, true, false, + true, false, true, false, false, + false, false, false, false, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, ispod && false, true); + + passed &= do_test(var(boost::ref(i)), true, true, true, true, true, + true, true, true, false, false, + false, false, false, false, true, + true, true, true, true, true, + ispod && true, ispod && true, ispod && true, true, true); + + passed &= do_test(var(boost::cref(i)), true, true, false, true, false, + true, false, true, false, false, + false, false, false, false, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, false, true); + + /** Const Reference Variable tests */ + + // This reference will be copied on input, which is expected + const T &ir = i; + + 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, + ispod && true, ispod && true, ispod && true, true, true); + + // But a pointer or reference to it should be necessarily const + passed &= do_test(var(&ir), true, true, false, true, false, + true, false, true, false, false, + false, false, false, false, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, false, true); + + passed &= do_test(var(boost::ref(ir)), true, true, false, true, false, + true, false, true, false, false, + false, false, false, false, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, false, true); + + // Make sure const of const works too + passed &= do_test(const_var(&ir), true, true, false, true, false, + true, false, true, false, false, + false, false, false, false, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, false, true); + + passed &= do_test(const_var(boost::ref(ir)), true, true, false, true, false, + true, false, true, false, false, + false, false, false, false, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, false, true); + + /** Const Reference Variable tests */ + + // This will always be seen as a const + const T*cip = &i; + passed &= do_test(var(cip), true, true, false, true, false, + true, false, true, false, false, + false, false, false, false, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, false, true); + + // make sure const of const works + passed &= do_test(const_var(cip), true, true, false, true, false, + true, false, true, false, false, + false, false, false, false, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, false, true); + + /** shared_ptr tests **/ + + boost::shared_ptr ip(new T(initial)); + + passed &= do_test(var(ip), true, true, true, true, true, + true, true, true, true, true, + true, true, true, true, true, + true, true, true, true, true, + ispod && true, ispod && true, ispod && true, true, true); + + passed &= do_test(const_var(ip), true, true, false, true, false, + true, false, true, false, true, + false, true, false, true, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, false, true); + + /** const shared_ptr tests **/ + boost::shared_ptr ipc(new T(initial)); + + passed &= do_test(var(ipc), true, true, false, true, false, + true, false, true, false, true, + false, true, false, true, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, false, true); + + // const of this should be the same, making sure it compiles + passed &= do_test(const_var(ipc), true, true, false, true, false, + true, false, true, false, true, + false, true, false, true, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, false, true); + + + /** Double ptr tests **/ + + /* + T **doublep; + + passed &= do_test(var(doublep), true, true, false, true, false, + true, false, true, false, true, + false, true, false, true, false, + true, false, true, false, true, + ispod && true, ispod && true, ispod && true, false, true); +*/ + + return passed; +} + + +template +bool pointer_test(const T& default_value, const T& new_value) +{ + T *p = new T(default_value); + + // we store a pointer to a pointer, so we can get a pointer to a pointer + try { + T **result = boxed_cast(var(&p)); + *(*result) = new_value; + + + if (p != (*result) ) { + std::cerr << "Pointer passed in different than one returned" << std::endl; + return false; + } + + if (*p != *(*result) ) { + std::cerr << "Somehow dereferenced pointer values are not the same?" << std::endl; + return false; + } + + return true; + } catch (const bad_boxed_cast &) { + std::cerr << "Bad boxed cast performing ** to ** test" << std::endl; + return false; + } catch (...) { + std::cerr << "Unknown exception performing ** to ** test" << std::endl; + return false; + } + + +} int main() @@ -119,42 +298,14 @@ int main() bool PODValue, bool ConstPODValue, bool ConstPODValueRef */ - int i = 5; - 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, true); - - passed &= do_test(const_var(i), true, true, false, true, false, - true, false, true, false, true, - false, true, false, true, false, - true, false, true, false, true, - true, true, true, false, true); - - passed &= do_test(var(&i), true, true, true, true, true, - true, true, true, false, false, - false, false, false, false, true, - true, true, true, true, true, - true, true, true, true, true); - - passed &= do_test(const_var(&i), true, true, false, true, false, - true, false, true, false, false, - false, false, false, false, false, - true, false, true, false, true, - true, true, true, false, true); - - passed &= do_test(var(boost::ref(i)), true, true, true, true, true, - true, true, true, false, false, - false, false, false, false, true, - true, true, true, true, true, - true, true, true, true, true); - - passed &= do_test(var(boost::cref(i)), true, true, false, true, false, - true, false, true, false, false, - false, false, false, false, false, - true, false, true, false, true, - true, true, true, false, true); + passed &= built_in_type_test(5, true); + passed &= built_in_type_test(1.1, true); + passed &= built_in_type_test('a', true); + passed &= built_in_type_test(false, true); + passed &= built_in_type_test("Hello World", false); + + // storing a pointer + passed &= pointer_test(1, 0); if (passed) {