Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: UAVCAN UAVCAN_Subscriber
templates.cpp
00001 /* 00002 * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com> 00003 */ 00004 00005 #include <gtest/gtest.h> 00006 #include <uavcan/util/templates.hpp> 00007 #include <limits> 00008 00009 struct NonConvertible { }; 00010 00011 struct ConvertibleToBool 00012 { 00013 const bool value; 00014 ConvertibleToBool(bool value) : value(value) { } 00015 operator bool() const { return value; } 00016 bool operator!() const { return !value; } 00017 }; 00018 00019 struct NonDefaultConstructible 00020 { 00021 NonDefaultConstructible(int) { } 00022 }; 00023 00024 TEST(Util, CoerceOrFallback) 00025 { 00026 using uavcan::coerceOrFallback; 00027 00028 ASSERT_FALSE(coerceOrFallback<bool>(NonConvertible())); 00029 ASSERT_TRUE(coerceOrFallback<bool>(NonConvertible(), true)); 00030 00031 ASSERT_EQ(0, coerceOrFallback<long>(NonConvertible())); 00032 ASSERT_EQ(9000, coerceOrFallback<long>(NonConvertible(), 9000)); 00033 00034 ASSERT_TRUE(coerceOrFallback<bool>(ConvertibleToBool(true))); 00035 ASSERT_TRUE(coerceOrFallback<bool>(ConvertibleToBool(true), false)); 00036 ASSERT_FALSE(coerceOrFallback<bool>(ConvertibleToBool(false))); 00037 ASSERT_FALSE(coerceOrFallback<bool>(ConvertibleToBool(false), true)); 00038 ASSERT_EQ(1, coerceOrFallback<long>(ConvertibleToBool(true))); 00039 ASSERT_EQ(0, coerceOrFallback<long>(ConvertibleToBool(false), -100)); 00040 00041 //coerceOrFallback<NonDefaultConstructible>(ConvertibleToBool(true)); // Will fail to compile 00042 coerceOrFallback<NonDefaultConstructible>(NonConvertible(), NonDefaultConstructible(64)); 00043 } 00044 00045 TEST(Util, FloatClassification) 00046 { 00047 // NAN 00048 ASSERT_TRUE(uavcan::isNaN(std::numeric_limits<float>::quiet_NaN())); 00049 ASSERT_FALSE(uavcan::isNaN(std::numeric_limits<double>::infinity())); 00050 ASSERT_FALSE(uavcan::isNaN(std::numeric_limits<long double>::infinity())); 00051 ASSERT_FALSE(uavcan::isNaN(123.456)); 00052 00053 // INF 00054 ASSERT_TRUE(uavcan::isInfinity(std::numeric_limits<float>::infinity())); 00055 ASSERT_TRUE(uavcan::isInfinity(-std::numeric_limits<long double>::infinity())); 00056 ASSERT_FALSE(uavcan::isInfinity(std::numeric_limits<float>::quiet_NaN())); 00057 ASSERT_FALSE(uavcan::isInfinity(-0.1L)); 00058 00059 // Signbit 00060 ASSERT_FALSE(uavcan::getSignBit(12)); 00061 ASSERT_TRUE(uavcan::getSignBit(-std::numeric_limits<long double>::infinity())); 00062 ASSERT_FALSE(uavcan::getSignBit(std::numeric_limits<float>::infinity())); 00063 ASSERT_TRUE(uavcan::getSignBit(-0.0)); // Negative zero 00064 }
Generated on Tue Jul 12 2022 17:17:34 by
