Руслан Урядинский / libuavcan

Dependents:   UAVCAN UAVCAN_Subscriber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers templates.cpp Source File

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 }