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.
This commit is contained in:
@@ -105,6 +105,185 @@ bool do_test(const Boxed_Value &bv, bool T, bool ConstT, bool TRef, bool ConstTR
|
|||||||
return passed;
|
return passed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Tests intended for built int types **/
|
||||||
|
template<typename T>
|
||||||
|
bool built_in_type_test(const T &initial, bool ispod)
|
||||||
|
{
|
||||||
|
bool passed = true;
|
||||||
|
|
||||||
|
/** value tests **/
|
||||||
|
T i = T(initial);
|
||||||
|
passed &= do_test<T>(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<T>(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<T>(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<T>(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<T>(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<T>(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<T>(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<T>(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<T>(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<T>(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<T>(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<T>(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<T>(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<T> ip(new T(initial));
|
||||||
|
|
||||||
|
passed &= do_test<T>(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<T>(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<const T> ipc(new T(initial));
|
||||||
|
|
||||||
|
passed &= do_test<T>(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<T>(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<T*>(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<typename T>
|
||||||
|
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<T **>(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()
|
int main()
|
||||||
@@ -119,42 +298,14 @@ int main()
|
|||||||
bool PODValue, bool ConstPODValue, bool ConstPODValueRef
|
bool PODValue, bool ConstPODValue, bool ConstPODValueRef
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int i = 5;
|
passed &= built_in_type_test<int>(5, true);
|
||||||
passed &= do_test<int>(var(i), true, true, true, true, true,
|
passed &= built_in_type_test<double>(1.1, true);
|
||||||
true, true, true, true, true,
|
passed &= built_in_type_test<char>('a', true);
|
||||||
true, true, true, true, true,
|
passed &= built_in_type_test<bool>(false, true);
|
||||||
true, true, true, true, true,
|
passed &= built_in_type_test<std::string>("Hello World", false);
|
||||||
true, true, true, true, true);
|
|
||||||
|
// storing a pointer
|
||||||
passed &= do_test<int>(const_var(i), true, true, false, true, false,
|
passed &= pointer_test<int>(1, 0);
|
||||||
true, false, true, false, true,
|
|
||||||
false, true, false, true, false,
|
|
||||||
true, false, true, false, true,
|
|
||||||
true, true, true, false, true);
|
|
||||||
|
|
||||||
passed &= do_test<int>(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<int>(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<int>(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<int>(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);
|
|
||||||
|
|
||||||
if (passed)
|
if (passed)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user