1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2014 The Chromium Authors. All rights reserved. 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file. 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// This file tests the C Mojo system macros and consists of "positive" tests, 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// i.e., those verifying that things work (without compile errors, or even 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// warnings if warnings are treated as errors). 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// TODO(vtl): Fix no-compile tests (which are all disabled; crbug.com/105388) 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// and write some "negative" tests. 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/c/system/macros.h" 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <assert.h> 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <stdint.h> 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <stdlib.h> 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "testing/gtest/include/gtest/gtest.h" 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace mojo { 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace { 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// First test |MOJO_STATIC_ASSERT()| in a global scope. 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezMOJO_STATIC_ASSERT(sizeof(int64_t) == 2 * sizeof(int32_t), 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "Bad static_assert() failure in global scope"); 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST(MacrosTest, CompileAssert) { 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Then in a local scope. 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MOJO_STATIC_ASSERT(sizeof(int32_t) == 2 * sizeof(int16_t), 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "Bad static_assert() failure"); 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST(MacrosTest, Alignof) { 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Strictly speaking, this isn't a portable test, but I think it'll pass on 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // all the platforms we currently support. 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(1u, MOJO_ALIGNOF(char)); 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(4u, MOJO_ALIGNOF(int32_t)); 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(8u, MOJO_ALIGNOF(int64_t)); 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(8u, MOJO_ALIGNOF(double)); 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// These structs are used in the Alignas test. Define them globally to avoid 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// MSVS warnings/errors. 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if defined(_MSC_VER) 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#pragma warning(push) 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Disable the warning "structure was padded due to __declspec(align())". 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#pragma warning(disable : 4324) 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct MOJO_ALIGNAS(1) StructAlignas1 { 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez char x; 50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct MOJO_ALIGNAS(4) StructAlignas4 { 52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez char x; 53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct MOJO_ALIGNAS(8) StructAlignas8 { 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez char x; 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if defined(_MSC_VER) 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#pragma warning(pop) 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST(MacrosTest, Alignas) { 62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(1u, MOJO_ALIGNOF(StructAlignas1)); 63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(4u, MOJO_ALIGNOF(StructAlignas4)); 64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(8u, MOJO_ALIGNOF(StructAlignas8)); 65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace 68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace mojo 69