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