172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/template_util.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "testing/gtest/include/gtest/gtest.h" 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace base { 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace { 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstruct AStruct {}; 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass AClass {}; 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenenum AnEnum {}; 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass Parent {}; 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass Child : public Parent {}; 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(TemplateUtilTest, IsPointer) { 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(is_pointer<int>::value); 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(is_pointer<int&>::value); 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(is_pointer<int*>::value); 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(is_pointer<const int*>::value); 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(TemplateUtilTest, IsArray) { 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(is_array<int>::value); 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(is_array<int*>::value); 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(is_array<int(*)[3]>::value); 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(is_array<int[]>::value); 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(is_array<const int[]>::value); 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(is_array<int[3]>::value); 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(TemplateUtilTest, IsNonConstReference) { 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(is_non_const_reference<int>::value); 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(is_non_const_reference<const int&>::value); 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(is_non_const_reference<int&>::value); 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(TemplateUtilTest, IsConvertible) { 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Extra parens needed to make EXPECT_*'s parsing happy. Otherwise, 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // it sees the equivalent of 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // EXPECT_TRUE( (is_convertible < Child), (Parent > ::value)); 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Silly C++. 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE( (is_convertible<Child, Parent>::value) ); 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE( (is_convertible<Parent, Child>::value) ); 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_FALSE( (is_convertible<Parent, AStruct>::value) ); 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE( (is_convertible<int, double>::value) ); 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_TRUE( (is_convertible<int*, void*>::value) ); 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_FALSE( (is_convertible<void*, int*>::value) ); 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(TemplateUtilTest, IsClass) { 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(is_class<AStruct>::value); 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(is_class<AClass>::value); 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(is_class<AnEnum>::value); 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(is_class<int>::value); 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(is_class<char*>::value); 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(is_class<int&>::value); 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(is_class<char[3]>::value); 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace base 69