Enhance testing of integer literals

* enable the ability to check a boxed_number conversion
 * fix integer_literal_test to pass on MacOS
This commit is contained in:
Jason Turner 2017-02-02 15:07:37 -07:00
parent ca7d4ab734
commit dca3ce4ea6
2 changed files with 115 additions and 62 deletions

View File

@ -585,6 +585,59 @@ namespace chaiscript
} }
template<typename Source, typename Target>
static void check_type()
{
if (sizeof(Source) != sizeof(Target)
|| std::is_signed<Source>() != std::is_signed<Target>()
|| std::is_floating_point<Source>() != std::is_floating_point<Target>())
{
throw chaiscript::detail::exception::bad_any_cast();
}
}
template<typename Target> Target get_as_checked() const
{
switch (get_common_type(bv)) {
case Common_Types::t_int32:
check_type<int32_t, Target>();
return get_as_aux<Target, int32_t>(bv);
case Common_Types::t_uint8:
check_type<uint8_t, Target>();
return get_as_aux<Target, uint8_t>(bv);
case Common_Types::t_int8:
check_type<int8_t, Target>();
return get_as_aux<Target, int8_t>(bv);
case Common_Types::t_uint16:
check_type<uint16_t, Target>();
return get_as_aux<Target, uint16_t>(bv);
case Common_Types::t_int16:
check_type<int16_t, Target>();
return get_as_aux<Target, int16_t>(bv);
case Common_Types::t_uint32:
check_type<uint32_t, Target>();
return get_as_aux<Target, uint32_t>(bv);
case Common_Types::t_uint64:
check_type<uint64_t, Target>();
return get_as_aux<Target, uint64_t>(bv);
case Common_Types::t_int64:
check_type<int64_t, Target>();
return get_as_aux<Target, int64_t>(bv);
case Common_Types::t_double:
check_type<double, Target>();
return get_as_aux<Target, double>(bv);
case Common_Types::t_float:
check_type<float, Target>();
return get_as_aux<Target, float>(bv);
case Common_Types::t_long_double:
check_type<long double, Target>();
return get_as_aux<Target, long double>(bv);
}
throw chaiscript::detail::exception::bad_any_cast();
}
template<typename Target> Target get_as() const template<typename Target> Target get_as() const
{ {
switch (get_common_type(bv)) { switch (get_common_type(bv)) {

View File

@ -19,7 +19,7 @@ bool test_literal(T val, const std::string &str, bool use_boxed_number = false)
if (!use_boxed_number) { if (!use_boxed_number) {
return chai.eval<T>(str); return chai.eval<T>(str);
} else { } else {
return chai.eval<chaiscript::Boxed_Number>(str).get_as<T>(); return chai.eval<chaiscript::Boxed_Number>(str).get_as_checked<T>();
} }
}(); }();
@ -126,66 +126,66 @@ int main()
&& test_literal(0x7FFFFFFFFFFFFFFF, "0b111111111111111111111111111111111111111111111111111111111111111") && test_literal(0x7FFFFFFFFFFFFFFF, "0b111111111111111111111111111111111111111111111111111111111111111")
&& TEST_LITERAL(-0xF) && TEST_LITERAL_SIGNED(-0xF)
&& TEST_LITERAL(-0xFF) && TEST_LITERAL_SIGNED(-0xFF)
&& TEST_LITERAL(-0xFFF) && TEST_LITERAL_SIGNED(-0xFFF)
&& TEST_LITERAL(-0xFFFF) && TEST_LITERAL_SIGNED(-0xFFFF)
&& TEST_LITERAL(-0xFFFFF) && TEST_LITERAL_SIGNED(-0xFFFFF)
&& TEST_LITERAL(-0xFFFFFF) && TEST_LITERAL_SIGNED(-0xFFFFFF)
&& TEST_LITERAL(-0xFFFFFFF) && TEST_LITERAL_SIGNED(-0xFFFFFFF)
&& TEST_LITERAL(-0xFFFFFFFF) && TEST_LITERAL_SIGNED(-0xFFFFFFFF)
&& TEST_LITERAL(-0xFFFFFFFFF) && TEST_LITERAL_SIGNED(-0xFFFFFFFFF)
&& TEST_LITERAL(-0xFFFFFFFFFF) && TEST_LITERAL_SIGNED(-0xFFFFFFFFFF)
&& TEST_LITERAL(-0xFFFFFFFFFFF) && TEST_LITERAL_SIGNED(-0xFFFFFFFFFFF)
&& TEST_LITERAL(-0xFFFFFFFFFFFF) && TEST_LITERAL_SIGNED(-0xFFFFFFFFFFFF)
&& TEST_LITERAL(-0xFFFFFFFFFFFFF) && TEST_LITERAL_SIGNED(-0xFFFFFFFFFFFFF)
&& TEST_LITERAL(-0xFFFFFFFFFFFFFF) && TEST_LITERAL_SIGNED(-0xFFFFFFFFFFFFFF)
&& TEST_LITERAL(-0xFFFFFFFFFFFFFFF) && TEST_LITERAL_SIGNED(-0xFFFFFFFFFFFFFFF)
&& TEST_LITERAL(-0xFFFFFFFFFFFFFFFF) && TEST_LITERAL_SIGNED(-0xFFFFFFFFFFFFFFFF)
&& TEST_LITERAL(-01) && TEST_LITERAL_SIGNED(-01)
&& TEST_LITERAL(-017) && TEST_LITERAL_SIGNED(-017)
&& TEST_LITERAL(-0177) && TEST_LITERAL_SIGNED(-0177)
&& TEST_LITERAL(-01777) && TEST_LITERAL_SIGNED(-01777)
&& TEST_LITERAL(-017777) && TEST_LITERAL_SIGNED(-017777)
&& TEST_LITERAL(-0177777) && TEST_LITERAL_SIGNED(-0177777)
&& TEST_LITERAL(-01777777) && TEST_LITERAL_SIGNED(-01777777)
&& TEST_LITERAL(-017777777) && TEST_LITERAL_SIGNED(-017777777)
&& TEST_LITERAL(-0177777777) && TEST_LITERAL_SIGNED(-0177777777)
&& TEST_LITERAL(-01777777777) && TEST_LITERAL_SIGNED(-01777777777)
&& TEST_LITERAL(-017777777777) && TEST_LITERAL_SIGNED(-017777777777)
&& TEST_LITERAL(-0177777777777) && TEST_LITERAL_SIGNED(-0177777777777)
&& TEST_LITERAL(-01777777777777) && TEST_LITERAL_SIGNED(-01777777777777)
&& TEST_LITERAL(-017777777777777) && TEST_LITERAL_SIGNED(-017777777777777)
&& TEST_LITERAL(-0177777777777777) && TEST_LITERAL_SIGNED(-0177777777777777)
&& TEST_LITERAL(-01777777777777777) && TEST_LITERAL_SIGNED(-01777777777777777)
&& TEST_LITERAL(-017777777777777777) && TEST_LITERAL_SIGNED(-017777777777777777)
&& TEST_LITERAL(-0177777777777777777) && TEST_LITERAL_SIGNED(-0177777777777777777)
&& TEST_LITERAL(-01777777777777777777) && TEST_LITERAL_SIGNED(-01777777777777777777)
&& TEST_LITERAL(-017777777777777777777) && TEST_LITERAL_SIGNED(-017777777777777777777)
&& TEST_LITERAL(-0177777777777777777777) && TEST_LITERAL_SIGNED(-0177777777777777777777)
&& TEST_LITERAL(-01777777777777777777777) && TEST_LITERAL_SIGNED(-01777777777777777777777)
&& TEST_LITERAL(-1) && TEST_LITERAL_SIGNED(-1)
&& TEST_LITERAL(-17) && TEST_LITERAL_SIGNED(-17)
&& TEST_LITERAL(-177) && TEST_LITERAL_SIGNED(-177)
&& TEST_LITERAL(-1777) && TEST_LITERAL_SIGNED(-1777)
&& TEST_LITERAL(-17777) && TEST_LITERAL_SIGNED(-17777)
&& TEST_LITERAL(-177777) && TEST_LITERAL_SIGNED(-177777)
&& TEST_LITERAL(-1777777) && TEST_LITERAL_SIGNED(-1777777)
&& TEST_LITERAL(-17777777) && TEST_LITERAL_SIGNED(-17777777)
&& TEST_LITERAL(-177777777) && TEST_LITERAL_SIGNED(-177777777)
&& TEST_LITERAL(-1777777777) && TEST_LITERAL_SIGNED(-1777777777)
&& TEST_LITERAL(-17777777777) && TEST_LITERAL_SIGNED(-17777777777)
&& TEST_LITERAL(-177777777777) && TEST_LITERAL_SIGNED(-177777777777)
&& TEST_LITERAL(-1777777777777) && TEST_LITERAL_SIGNED(-1777777777777)
&& TEST_LITERAL(-17777777777777) && TEST_LITERAL_SIGNED(-17777777777777)
&& TEST_LITERAL(-177777777777777) && TEST_LITERAL_SIGNED(-177777777777777)
&& TEST_LITERAL(-1777777777777777) && TEST_LITERAL_SIGNED(-1777777777777777)
&& TEST_LITERAL(-17777777777777777) && TEST_LITERAL_SIGNED(-17777777777777777)
&& TEST_LITERAL(-177777777777777777) && TEST_LITERAL_SIGNED(-177777777777777777)
&& TEST_LITERAL(-1777777777777777777) && TEST_LITERAL_SIGNED(-1777777777777777777)
// Test 8/16/24/32 bit boundaries for various types // Test 8/16/24/32 bit boundaries for various types
@ -194,10 +194,10 @@ int main()
&& TEST_LITERAL(16777215) && TEST_LITERAL(16777215)
&& TEST_LITERAL(4294967295) && TEST_LITERAL(4294967295)
&& TEST_LITERAL(-255) && TEST_LITERAL_SIGNED(-255)
&& TEST_LITERAL(-65535) && TEST_LITERAL_SIGNED(-65535)
&& TEST_LITERAL(-16777215) && TEST_LITERAL_SIGNED(-16777215)
&& TEST_LITERAL(-4294967295) && TEST_LITERAL_SIGNED(-4294967295)
&& TEST_LITERAL(255u) && TEST_LITERAL(255u)
&& TEST_LITERAL(65535u) && TEST_LITERAL(65535u)