test_type_traits.cpp revision 2a4077a9186d6f6dff104bbd1a73484aae6d5c01
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *  * Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 *  * Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in
12 *    the documentation and/or other materials provided with the
13 *    distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#include "../include/type_traits.h"
30#ifndef ANDROID_ASTL_TYPE_TRAITS_H__
31#error "Wrong header included!!"
32#endif
33
34#include "common.h"
35
36namespace android {
37
38using std::true_type;
39using std::false_type;
40
41bool testTrueFalseType()
42{
43    EXPECT_TRUE(true_type::value == true);
44    EXPECT_TRUE(false_type::value == false);
45    EXPECT_TRUE(true_type::type::value == true);
46    EXPECT_TRUE(false_type::type::value == false);
47
48    typedef true_type::value_type       true_value_type;
49    typedef true_type::type             true_type;
50    typedef true_type::type::value_type true_type_value_type;
51    typedef true_type::type::type       true_type_type;
52
53    typedef false_type::value_type       false_value_type;
54    typedef false_type::type             false_type;
55    typedef false_type::type::value_type false_type_value_type;
56    typedef false_type::type::type       false_type_type;
57    return true;
58}
59
60bool testIsIntegral()
61{
62    using std::is_integral;
63    EXPECT_TRUE(is_integral<bool>::value == true);
64    EXPECT_TRUE(is_integral<char>::value == true);
65    EXPECT_TRUE(is_integral<signed char>::value == true);
66    EXPECT_TRUE(is_integral<unsigned char>::value == true);
67    EXPECT_TRUE(is_integral<wchar_t>::value == true);
68    EXPECT_TRUE(is_integral<short>::value == true);
69    EXPECT_TRUE(is_integral<unsigned short>::value == true);
70    EXPECT_TRUE(is_integral<int>::value == true);
71    EXPECT_TRUE(is_integral<unsigned int>::value == true);
72    EXPECT_TRUE(is_integral<long>::value == true);
73    EXPECT_TRUE(is_integral<unsigned long>::value == true);
74    EXPECT_TRUE(is_integral<long long>::value == true);
75    EXPECT_TRUE(is_integral<unsigned long long>::value == true);
76
77    // const
78    EXPECT_TRUE(is_integral<int const>::value == true);
79    EXPECT_TRUE(is_integral<const int>::value == true);
80
81    // volatile
82    EXPECT_TRUE(is_integral<int volatile>::value == true);
83    EXPECT_TRUE(is_integral<int const volatile>::value == true);
84
85    // float is not
86    EXPECT_TRUE(is_integral<float>::value == false);
87    return true;
88}
89
90bool testIsFloatingPoint()
91{
92    using std::is_floating_point;
93    EXPECT_TRUE(is_floating_point<float>::value == true);
94    EXPECT_TRUE(is_floating_point<double>::value == true);
95    EXPECT_TRUE(is_floating_point<long double>::value == true);
96    return true;
97}
98
99bool testIsPointer()
100{
101    using std::is_pointer;
102    EXPECT_TRUE(is_pointer<float>::value == false);
103    EXPECT_TRUE(is_pointer<int *>::value == true);
104    return true;
105}
106
107class A {};
108
109bool testIsPodOrClass()
110{
111    using std::is_class;
112    using std::is_pod;
113    EXPECT_TRUE(is_pod<float>::value == true);
114    EXPECT_TRUE(is_pod<int *>::value == true);
115    EXPECT_TRUE(is_pod<A>::value == false);
116
117    EXPECT_TRUE(is_class<float>::value == false);
118    EXPECT_TRUE(is_class<int *>::value == false);
119    EXPECT_TRUE(is_class<A>::value == true);
120    return true;
121}
122}  // namespace android
123
124int main(int argc, char **argv)
125{
126    FAIL_UNLESS(testTrueFalseType);
127    FAIL_UNLESS(testIsIntegral);
128    FAIL_UNLESS(testIsFloatingPoint);
129    FAIL_UNLESS(testIsPointer);
130    FAIL_UNLESS(testIsPodOrClass);
131    return kPassed;
132}
133