diff options
Diffstat (limited to 'mojo/public/c/system/tests/macros_unittest.cc')
-rw-r--r-- | mojo/public/c/system/tests/macros_unittest.cc | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/mojo/public/c/system/tests/macros_unittest.cc b/mojo/public/c/system/tests/macros_unittest.cc new file mode 100644 index 0000000..b22e124 --- /dev/null +++ b/mojo/public/c/system/tests/macros_unittest.cc @@ -0,0 +1,84 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file tests the C Mojo system macros and consists of "positive" tests, +// i.e., those verifying that things work (without compile errors, or even +// warnings if warnings are treated as errors). +// TODO(vtl): Fix no-compile tests (which are all disabled; crbug.com/105388) +// and write some "negative" tests. + +#include "mojo/public/c/system/macros.h" + +#include <assert.h> +#include <stdint.h> +#include <stdlib.h> + +#include "testing/gtest/include/gtest/gtest.h" + +namespace mojo { +namespace { + +TEST(MacrosTest, AllowUnused) { + // Test that no warning/error is issued even though |x| is unused. + int x = 123; + MOJO_ALLOW_UNUSED_LOCAL(x); +} + +int MustUseReturnedResult() MOJO_WARN_UNUSED_RESULT; +int MustUseReturnedResult() { + return 456; +} + +TEST(MacrosTest, WarnUnusedResult) { + if (!MustUseReturnedResult()) + abort(); +} + +// First test |MOJO_STATIC_ASSERT()| in a global scope. +MOJO_STATIC_ASSERT(sizeof(int64_t) == 2 * sizeof(int32_t), + "Bad static_assert() failure in global scope"); + +TEST(MacrosTest, CompileAssert) { + // Then in a local scope. + MOJO_STATIC_ASSERT(sizeof(int32_t) == 2 * sizeof(int16_t), + "Bad static_assert() failure"); +} + +TEST(MacrosTest, Alignof) { + // Strictly speaking, this isn't a portable test, but I think it'll pass on + // all the platforms we currently support. + EXPECT_EQ(1u, MOJO_ALIGNOF(char)); + EXPECT_EQ(4u, MOJO_ALIGNOF(int32_t)); + EXPECT_EQ(8u, MOJO_ALIGNOF(int64_t)); + EXPECT_EQ(8u, MOJO_ALIGNOF(double)); +} + +// These structs are used in the Alignas test. Define them globally to avoid +// MSVS warnings/errors. +#if defined(_MSC_VER) +#pragma warning(push) +// Disable the warning "structure was padded due to __declspec(align())". +#pragma warning(disable : 4324) +#endif +struct MOJO_ALIGNAS(1) StructAlignas1 { + char x; +}; +struct MOJO_ALIGNAS(4) StructAlignas4 { + char x; +}; +struct MOJO_ALIGNAS(8) StructAlignas8 { + char x; +}; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +TEST(MacrosTest, Alignas) { + EXPECT_EQ(1u, MOJO_ALIGNOF(StructAlignas1)); + EXPECT_EQ(4u, MOJO_ALIGNOF(StructAlignas4)); + EXPECT_EQ(8u, MOJO_ALIGNOF(StructAlignas8)); +} + +} // namespace +} // namespace mojo |