1f92157deSopenharmony_ci// Copyright 2018, Google Inc. 2f92157deSopenharmony_ci// All rights reserved. 3f92157deSopenharmony_ci// 4f92157deSopenharmony_ci// Redistribution and use in source and binary forms, with or without 5f92157deSopenharmony_ci// modification, are permitted provided that the following conditions are 6f92157deSopenharmony_ci// met: 7f92157deSopenharmony_ci// 8f92157deSopenharmony_ci// * Redistributions of source code must retain the above copyright 9f92157deSopenharmony_ci// notice, this list of conditions and the following disclaimer. 10f92157deSopenharmony_ci// * Redistributions in binary form must reproduce the above 11f92157deSopenharmony_ci// copyright notice, this list of conditions and the following disclaimer 12f92157deSopenharmony_ci// in the documentation and/or other materials provided with the 13f92157deSopenharmony_ci// distribution. 14f92157deSopenharmony_ci// * Neither the name of Google Inc. nor the names of its 15f92157deSopenharmony_ci// contributors may be used to endorse or promote products derived from 16f92157deSopenharmony_ci// this software without specific prior written permission. 17f92157deSopenharmony_ci// 18f92157deSopenharmony_ci// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19f92157deSopenharmony_ci// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20f92157deSopenharmony_ci// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21f92157deSopenharmony_ci// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22f92157deSopenharmony_ci// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23f92157deSopenharmony_ci// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24f92157deSopenharmony_ci// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25f92157deSopenharmony_ci// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26f92157deSopenharmony_ci// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27f92157deSopenharmony_ci// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28f92157deSopenharmony_ci// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29f92157deSopenharmony_ci 30f92157deSopenharmony_ci// Google Mock - a framework for writing C++ mock classes. 31f92157deSopenharmony_ci// 32f92157deSopenharmony_ci// This file tests the internal preprocessor macro library. 33f92157deSopenharmony_ci#include <string> 34f92157deSopenharmony_ci 35f92157deSopenharmony_ci#include "gmock/gmock.h" 36f92157deSopenharmony_ci#include "gmock/internal/gmock-pp.h" 37f92157deSopenharmony_ci 38f92157deSopenharmony_cinamespace testing { 39f92157deSopenharmony_cinamespace { 40f92157deSopenharmony_ci 41f92157deSopenharmony_ci// Matcher to verify that to strings are identical up to whitespace 42f92157deSopenharmony_ci// Not 100% correct, because it treats "AB" as equal to "A B". 43f92157deSopenharmony_ci::testing::Matcher<const std::string&> SameExceptSpaces(const std::string& s) { 44f92157deSopenharmony_ci auto remove_spaces = [](std::string to_split) { 45f92157deSopenharmony_ci to_split.erase(std::remove(to_split.begin(), to_split.end(), ' '), 46f92157deSopenharmony_ci to_split.end()); 47f92157deSopenharmony_ci return to_split; 48f92157deSopenharmony_ci }; 49f92157deSopenharmony_ci return ::testing::ResultOf(remove_spaces, remove_spaces(s)); 50f92157deSopenharmony_ci} 51f92157deSopenharmony_ci 52f92157deSopenharmony_ci// Verify that a macro expands to a given text. Ignores whitespace difference. 53f92157deSopenharmony_ci// In MSVC, GMOCK_PP_STRINGIZE() returns nothing, rather than "". So concatenate 54f92157deSopenharmony_ci// with an empty string. 55f92157deSopenharmony_ci#define EXPECT_EXPANSION(Result, Macro) \ 56f92157deSopenharmony_ci EXPECT_THAT("" GMOCK_PP_STRINGIZE(Macro), SameExceptSpaces(Result)) 57f92157deSopenharmony_ci 58f92157deSopenharmony_ciTEST(Macros, Cat) { 59f92157deSopenharmony_ci EXPECT_EXPANSION("14", GMOCK_PP_CAT(1, 4)); 60f92157deSopenharmony_ci EXPECT_EXPANSION("+=", GMOCK_PP_CAT(+, =)); 61f92157deSopenharmony_ci} 62f92157deSopenharmony_ci 63f92157deSopenharmony_ciTEST(Macros, Narg) { 64f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_NARG()); 65f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_NARG(x)); 66f92157deSopenharmony_ci EXPECT_EXPANSION("2", GMOCK_PP_NARG(x, y)); 67f92157deSopenharmony_ci EXPECT_EXPANSION("3", GMOCK_PP_NARG(x, y, z)); 68f92157deSopenharmony_ci EXPECT_EXPANSION("4", GMOCK_PP_NARG(x, y, z, w)); 69f92157deSopenharmony_ci 70f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_NARG0()); 71f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_NARG0(x)); 72f92157deSopenharmony_ci EXPECT_EXPANSION("2", GMOCK_PP_NARG0(x, y)); 73f92157deSopenharmony_ci} 74f92157deSopenharmony_ci 75f92157deSopenharmony_ciTEST(Macros, Comma) { 76f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_HAS_COMMA()); 77f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_HAS_COMMA(, )); 78f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_HAS_COMMA((, ))); 79f92157deSopenharmony_ci} 80f92157deSopenharmony_ci 81f92157deSopenharmony_ciTEST(Macros, IsEmpty) { 82f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_IS_EMPTY()); 83f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_IS_EMPTY(, )); 84f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_IS_EMPTY(a)); 85f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_IS_EMPTY(())); 86f92157deSopenharmony_ci 87f92157deSopenharmony_ci#define GMOCK_PP_INTERNAL_IS_EMPTY_TEST_1 88f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_IS_EMPTY(GMOCK_PP_INTERNAL_IS_EMPTY_TEST_1)); 89f92157deSopenharmony_ci} 90f92157deSopenharmony_ci 91f92157deSopenharmony_ciTEST(Macros, If) { 92f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_IF(1, 1, 2)); 93f92157deSopenharmony_ci EXPECT_EXPANSION("2", GMOCK_PP_IF(0, 1, 2)); 94f92157deSopenharmony_ci} 95f92157deSopenharmony_ci 96f92157deSopenharmony_ciTEST(Macros, HeadTail) { 97f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_HEAD(1)); 98f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_HEAD(1, 2)); 99f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_HEAD(1, 2, 3)); 100f92157deSopenharmony_ci 101f92157deSopenharmony_ci EXPECT_EXPANSION("", GMOCK_PP_TAIL(1)); 102f92157deSopenharmony_ci EXPECT_EXPANSION("2", GMOCK_PP_TAIL(1, 2)); 103f92157deSopenharmony_ci EXPECT_EXPANSION("2", GMOCK_PP_HEAD(GMOCK_PP_TAIL(1, 2, 3))); 104f92157deSopenharmony_ci} 105f92157deSopenharmony_ci 106f92157deSopenharmony_ciTEST(Macros, Parentheses) { 107f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_IS_BEGIN_PARENS(sss)); 108f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_IS_BEGIN_PARENS(sss())); 109f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_IS_BEGIN_PARENS(sss() sss)); 110f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_IS_BEGIN_PARENS((sss))); 111f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_IS_BEGIN_PARENS((sss)ss)); 112f92157deSopenharmony_ci 113f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_IS_ENCLOSED_PARENS(sss)); 114f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_IS_ENCLOSED_PARENS(sss())); 115f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_IS_ENCLOSED_PARENS(sss() sss)); 116f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_IS_ENCLOSED_PARENS((sss))); 117f92157deSopenharmony_ci EXPECT_EXPANSION("0", GMOCK_PP_IS_ENCLOSED_PARENS((sss)ss)); 118f92157deSopenharmony_ci 119f92157deSopenharmony_ci EXPECT_EXPANSION("1 + 1", GMOCK_PP_REMOVE_PARENS((1 + 1))); 120f92157deSopenharmony_ci} 121f92157deSopenharmony_ci 122f92157deSopenharmony_ciTEST(Macros, Increment) { 123f92157deSopenharmony_ci EXPECT_EXPANSION("1", GMOCK_PP_INC(0)); 124f92157deSopenharmony_ci EXPECT_EXPANSION("2", GMOCK_PP_INC(1)); 125f92157deSopenharmony_ci EXPECT_EXPANSION("3", GMOCK_PP_INC(2)); 126f92157deSopenharmony_ci EXPECT_EXPANSION("4", GMOCK_PP_INC(3)); 127f92157deSopenharmony_ci EXPECT_EXPANSION("5", GMOCK_PP_INC(4)); 128f92157deSopenharmony_ci 129f92157deSopenharmony_ci EXPECT_EXPANSION("16", GMOCK_PP_INC(15)); 130f92157deSopenharmony_ci} 131f92157deSopenharmony_ci 132f92157deSopenharmony_ci#define JOINER_CAT(a, b) a##b 133f92157deSopenharmony_ci#define JOINER(_N, _Data, _Elem) JOINER_CAT(_Data, _N) = _Elem 134f92157deSopenharmony_ci 135f92157deSopenharmony_ciTEST(Macros, Repeat) { 136f92157deSopenharmony_ci EXPECT_EXPANSION("", GMOCK_PP_REPEAT(JOINER, X, 0)); 137f92157deSopenharmony_ci EXPECT_EXPANSION("X0=", GMOCK_PP_REPEAT(JOINER, X, 1)); 138f92157deSopenharmony_ci EXPECT_EXPANSION("X0= X1=", GMOCK_PP_REPEAT(JOINER, X, 2)); 139f92157deSopenharmony_ci EXPECT_EXPANSION("X0= X1= X2=", GMOCK_PP_REPEAT(JOINER, X, 3)); 140f92157deSopenharmony_ci EXPECT_EXPANSION("X0= X1= X2= X3=", GMOCK_PP_REPEAT(JOINER, X, 4)); 141f92157deSopenharmony_ci EXPECT_EXPANSION("X0= X1= X2= X3= X4=", GMOCK_PP_REPEAT(JOINER, X, 5)); 142f92157deSopenharmony_ci EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5=", GMOCK_PP_REPEAT(JOINER, X, 6)); 143f92157deSopenharmony_ci EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6=", 144f92157deSopenharmony_ci GMOCK_PP_REPEAT(JOINER, X, 7)); 145f92157deSopenharmony_ci EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6= X7=", 146f92157deSopenharmony_ci GMOCK_PP_REPEAT(JOINER, X, 8)); 147f92157deSopenharmony_ci EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6= X7= X8=", 148f92157deSopenharmony_ci GMOCK_PP_REPEAT(JOINER, X, 9)); 149f92157deSopenharmony_ci EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6= X7= X8= X9=", 150f92157deSopenharmony_ci GMOCK_PP_REPEAT(JOINER, X, 10)); 151f92157deSopenharmony_ci EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6= X7= X8= X9= X10=", 152f92157deSopenharmony_ci GMOCK_PP_REPEAT(JOINER, X, 11)); 153f92157deSopenharmony_ci EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6= X7= X8= X9= X10= X11=", 154f92157deSopenharmony_ci GMOCK_PP_REPEAT(JOINER, X, 12)); 155f92157deSopenharmony_ci EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6= X7= X8= X9= X10= X11= X12=", 156f92157deSopenharmony_ci GMOCK_PP_REPEAT(JOINER, X, 13)); 157f92157deSopenharmony_ci EXPECT_EXPANSION( 158f92157deSopenharmony_ci "X0= X1= X2= X3= X4= X5= X6= X7= X8= X9= X10= X11= X12= X13=", 159f92157deSopenharmony_ci GMOCK_PP_REPEAT(JOINER, X, 14)); 160f92157deSopenharmony_ci EXPECT_EXPANSION( 161f92157deSopenharmony_ci "X0= X1= X2= X3= X4= X5= X6= X7= X8= X9= X10= X11= X12= X13= X14=", 162f92157deSopenharmony_ci GMOCK_PP_REPEAT(JOINER, X, 15)); 163f92157deSopenharmony_ci} 164f92157deSopenharmony_ciTEST(Macros, ForEach) { 165f92157deSopenharmony_ci EXPECT_EXPANSION("", GMOCK_PP_FOR_EACH(JOINER, X, ())); 166f92157deSopenharmony_ci EXPECT_EXPANSION("X0=a", GMOCK_PP_FOR_EACH(JOINER, X, (a))); 167f92157deSopenharmony_ci EXPECT_EXPANSION("X0=a X1=b", GMOCK_PP_FOR_EACH(JOINER, X, (a, b))); 168f92157deSopenharmony_ci EXPECT_EXPANSION("X0=a X1=b X2=c", GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c))); 169f92157deSopenharmony_ci EXPECT_EXPANSION("X0=a X1=b X2=c X3=d", 170f92157deSopenharmony_ci GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d))); 171f92157deSopenharmony_ci EXPECT_EXPANSION("X0=a X1=b X2=c X3=d X4=e", 172f92157deSopenharmony_ci GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e))); 173f92157deSopenharmony_ci EXPECT_EXPANSION("X0=a X1=b X2=c X3=d X4=e X5=f", 174f92157deSopenharmony_ci GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f))); 175f92157deSopenharmony_ci EXPECT_EXPANSION("X0=a X1=b X2=c X3=d X4=e X5=f X6=g", 176f92157deSopenharmony_ci GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g))); 177f92157deSopenharmony_ci EXPECT_EXPANSION("X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h", 178f92157deSopenharmony_ci GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h))); 179f92157deSopenharmony_ci EXPECT_EXPANSION("X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h X8=i", 180f92157deSopenharmony_ci GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h, i))); 181f92157deSopenharmony_ci EXPECT_EXPANSION( 182f92157deSopenharmony_ci "X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h X8=i X9=j", 183f92157deSopenharmony_ci GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h, i, j))); 184f92157deSopenharmony_ci EXPECT_EXPANSION( 185f92157deSopenharmony_ci "X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h X8=i X9=j X10=k", 186f92157deSopenharmony_ci GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h, i, j, k))); 187f92157deSopenharmony_ci EXPECT_EXPANSION( 188f92157deSopenharmony_ci "X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h X8=i X9=j X10=k X11=l", 189f92157deSopenharmony_ci GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h, i, j, k, l))); 190f92157deSopenharmony_ci EXPECT_EXPANSION( 191f92157deSopenharmony_ci "X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h X8=i X9=j X10=k X11=l X12=m", 192f92157deSopenharmony_ci GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h, i, j, k, l, m))); 193f92157deSopenharmony_ci EXPECT_EXPANSION( 194f92157deSopenharmony_ci "X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h X8=i X9=j X10=k X11=l X12=m " 195f92157deSopenharmony_ci "X13=n", 196f92157deSopenharmony_ci GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h, i, j, k, l, m, n))); 197f92157deSopenharmony_ci EXPECT_EXPANSION( 198f92157deSopenharmony_ci "X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h X8=i X9=j X10=k X11=l X12=m " 199f92157deSopenharmony_ci "X13=n X14=o", 200f92157deSopenharmony_ci GMOCK_PP_FOR_EACH(JOINER, X, 201f92157deSopenharmony_ci (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o))); 202f92157deSopenharmony_ci} 203f92157deSopenharmony_ci 204f92157deSopenharmony_ci} // namespace 205f92157deSopenharmony_ci} // namespace testing 206