Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 //#define LOG_NDEBUG 0
     18 #define LOG_TAG "TypeTraits_test"
     19 
     20 #include <gtest/gtest.h>
     21 
     22 #include <media/stagefright/foundation/TypeTraits.h>
     23 
     24 namespace android {
     25 
     26 class TypeTraitsTest : public ::testing::Test {
     27 protected:
     28     enum A { };
     29     enum UA : uint32_t { };
     30     enum IA : int32_t { };
     31 };
     32 
     33 // =========== basic sanity tests for type-support templates
     34 TEST_F(TypeTraitsTest, StaticTests) {
     35 
     36     // ============ is_integral_or_enum
     37 
     38     static_assert(!std::is_integral<A>::value, "enums should not be integral");
     39     static_assert(!std::is_integral<UA>::value, "enums should not be integral");
     40     static_assert(!std::is_integral<IA>::value, "enums should not be integral");
     41     static_assert(is_integral_or_enum<A>::value, "enums should be integral_or_enum");
     42     static_assert(is_integral_or_enum<UA>::value, "enums should be integral_or_enum");
     43     static_assert(is_integral_or_enum<IA>::value, "enums should be integral_or_enum");
     44     static_assert(is_integral_or_enum<int>::value, "ints should be integral_or_enum");
     45     static_assert(is_integral_or_enum<unsigned>::value, "unsigned ints should be integral_or_enum");
     46     static_assert(!is_integral_or_enum<float>::value, "floats should not be integral_or_enum");
     47 
     48     // ============ is_unsigned_integral
     49 
     50     static_assert(!std::is_unsigned<UA>::value,
     51                   "unsigned enums should not be unsigned");
     52     static_assert(!std::is_unsigned<IA>::value,
     53                   "unsigned enums should not be unsigned");
     54     static_assert(std::is_unsigned<typename std::underlying_type<UA>::type>::value,
     55                   "underlying type of unsigned enums should be unsigned");
     56     static_assert(!std::is_unsigned<typename std::underlying_type<IA>::type>::value,
     57                   "underlying type of unsigned enums should be unsigned");
     58     static_assert(is_unsigned_integral<UA>::value,
     59                   "unsigned enums should be unsigned_integral");
     60     static_assert(!is_unsigned_integral<IA>::value,
     61                   "signed enums should not be unsigned_integral");
     62     static_assert(is_unsigned_integral<unsigned>::value,
     63                   "unsigned ints should be unsigned_integral");
     64     static_assert(!is_unsigned_integral<int>::value,
     65                   "ints should not be unsigned_integral");
     66     static_assert(!is_unsigned_integral<float>::value,
     67                   "floats should not be unsigned_integral");
     68 
     69     // ============ is_signed_integral
     70 
     71     static_assert(!std::is_signed<UA>::value,
     72                   "unsigned enums should not be signed");
     73     static_assert(!std::is_signed<IA>::value,
     74                   "unsigned enums should not be signed");
     75     static_assert(!std::is_signed<typename std::underlying_type<UA>::type>::value,
     76                   "underlying type of unsigned enums should be signed");
     77     static_assert(std::is_signed<typename std::underlying_type<IA>::type>::value,
     78                   "underlying type of unsigned enums should be signed");
     79     static_assert(!is_signed_integral<UA>::value,
     80                   "unsigned enums should not be signed_integral");
     81     static_assert(is_signed_integral<IA>::value,
     82                   "signed enums should be signed_integral");
     83     static_assert(!is_signed_integral<unsigned>::value,
     84                   "unsigned ints should not be signed_integral");
     85     static_assert(is_signed_integral<int>::value,
     86                   "ints should be signed_integral");
     87     static_assert(!is_signed_integral<float>::value,
     88                   "floats should not be signed_integral");
     89 
     90     // ============ underlying_integral_type
     91 
     92     static_assert(std::is_same<uint64_t, typename underlying_integral_type<uint64_t>::type>::value,
     93                   "underlying integral type of uint64_t should be uint64_t");
     94     static_assert(std::is_same<uint32_t, typename underlying_integral_type<UA>::type>::value,
     95                   "underlying integral type of uint32_t based enums should be uint32_t");
     96     static_assert(std::is_same<int64_t, typename underlying_integral_type<int64_t>::type>::value,
     97                   "underlying integral type of int64_t should be int64_t");
     98     static_assert(std::is_same<int32_t, typename underlying_integral_type<IA>::type>::value,
     99                   "underlying integral type of int32_t based enums should be int32_t");
    100     //typedef underlying_integral_type<float>::type no_type;
    101     static_assert(std::is_same<void, typename underlying_integral_type<float, void>::type>::value,
    102                   "underlying integral type of float cannot be specified");
    103 
    104     // ============ is_one_of
    105 
    106     static_assert(!is_one_of<int>::value, "int shouldn't be one of {}");
    107     static_assert(!is_one_of<int, unsigned>::value, "int shouldn't be one of {unsigned}");
    108     static_assert(!is_one_of<int, unsigned, float>::value,
    109                   "int shouldn't be one of {unsigned, float}");
    110     static_assert(is_one_of<int, int>::value, "int should be one of {int}");
    111     static_assert(is_one_of<int, int, float>::value, "int should be one of {int, float}");
    112     static_assert(is_one_of<int, float, int>::value, "int should be one of {float, int}");
    113     static_assert(is_one_of<int, float, int, unsigned>::value,
    114                   "int should be one of {float, int, unsigned}");
    115     static_assert(is_one_of<int, float, unsigned, int>::value,
    116                   "int should be one of {float, unsigned, int}");
    117     static_assert(!is_one_of<int, int&>::value, "int shouldn't be one of {int&}");
    118 
    119     // ============ are_unique
    120 
    121     static_assert(are_unique<>::value, "{} should be unique");
    122     static_assert(are_unique<int>::value, "{int} should be unique");
    123     static_assert(are_unique<int, float>::value, "{int, float} should be unique");
    124     static_assert(!are_unique<int, int>::value, "{int, int} shouldn't be unique");
    125     static_assert(!are_unique<int, float, int>::value, "{int, float, int} shouldn't be unique");
    126     static_assert(!are_unique<float, int, int>::value, "{float, int, int} shouldn't be unique");
    127     static_assert(!are_unique<int, int, float>::value, "{int, int, float} shouldn't be unique");
    128 
    129     // ============ find_first
    130 
    131     static_assert(find_first<int>::index == 0, "int is not in {}");
    132     static_assert(find_first<int, unsigned>::index == 0, "int is not in {unsigned}");
    133     static_assert(find_first<int, unsigned, float>::index == 0, "int is not in {unsigned, float}");
    134     static_assert(find_first<int, int>::index == 1, "int is 1st in {int}");
    135     static_assert(find_first<int, int, float>::index == 1, "int is 1st in {int, float}");
    136     static_assert(find_first<int, float, int>::index == 2, "int is 2nd in {float, int}");
    137     static_assert(find_first<int, float, int, unsigned>::index == 2,
    138                   "int is 2nd in {float, int, unsigned}");
    139     static_assert(find_first<int, float, int, unsigned>::index == 2,
    140                   "int is 2nd and 3rd in {float, int, int, unsigned}");
    141     static_assert(find_first<int, float, unsigned, int>::index == 3,
    142                   "int is 3rd in {float, unsigned, int}");
    143     static_assert(find_first<int, int&>::index == 0, "int is not in {int&}");
    144 
    145     // ============ find_first_convertible_to
    146 
    147     static_assert(find_first_convertible_to<int>::index == 0, "int is not convertible to {}");
    148     static_assert(find_first_convertible_to<int, unsigned*>::index == 0,
    149                   "int is not convertible to {unsigned*}");
    150     static_assert(find_first_convertible_to<int, unsigned*, float&>::index == 0,
    151                   "int is not convertible to {unsigned, float&}");
    152     static_assert(find_first_convertible_to<int, int>::index == 1, "int is convertible to {int}");
    153     static_assert(find_first_convertible_to<int, unsigned, int>::index == 1,
    154                   "int is convertible to 1st of {unsigned, int}");
    155     static_assert(find_first_convertible_to<int, int&, float>::index == 2,
    156                   "int is convertible to 2nd of {int&, float}");
    157     static_assert(find_first_convertible_to<float, float*, int, unsigned>::index == 2,
    158                   "float is convertible to 2nd of {float*, int, unsigned}");
    159     static_assert(find_first_convertible_to<float, void, float[1], int>::index == 3,
    160                   "int is 3rd convertible to {void, float[], int}");
    161     static_assert(find_first_convertible_to<int&, const int&>::index == 1,
    162                   "int& is convertible to {const int&}");
    163     static_assert(find_first_convertible_to<const int&, int&>::index == 0,
    164                   "const int& is not convertible to {int&}");
    165 }
    166 
    167 } // namespace android
    168