Path: blob/main/contrib/googletest/googlemock/test/gmock-pp-string_test.cc
48254 views
// Copyright 2018, Google Inc.1// All rights reserved.2//3// Redistribution and use in source and binary forms, with or without4// modification, are permitted provided that the following conditions are5// met:6//7// * Redistributions of source code must retain the above copyright8// notice, this list of conditions and the following disclaimer.9// * Redistributions in binary form must reproduce the above10// copyright notice, this list of conditions and the following disclaimer11// in the documentation and/or other materials provided with the12// distribution.13// * Neither the name of Google Inc. nor the names of its14// contributors may be used to endorse or promote products derived from15// this software without specific prior written permission.16//17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT19// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR20// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT21// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,22// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT23// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,24// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY25// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT26// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE27// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.2829// Google Mock - a framework for writing C++ mock classes.30//31// This file tests the internal preprocessor macro library.32#include <string>3334#include "gmock/gmock.h"35#include "gmock/internal/gmock-pp.h"3637namespace testing {38namespace {3940// Matcher to verify that to strings are identical up to whitespace41// Not 100% correct, because it treats "AB" as equal to "A B".42::testing::Matcher<const std::string&> SameExceptSpaces(const std::string& s) {43auto remove_spaces = [](std::string to_split) {44to_split.erase(std::remove(to_split.begin(), to_split.end(), ' '),45to_split.end());46return to_split;47};48return ::testing::ResultOf(remove_spaces, remove_spaces(s));49}5051// Verify that a macro expands to a given text. Ignores whitespace difference.52// In MSVC, GMOCK_PP_STRINGIZE() returns nothing, rather than "". So concatenate53// with an empty string.54#define EXPECT_EXPANSION(Result, Macro) \55EXPECT_THAT("" GMOCK_PP_STRINGIZE(Macro), SameExceptSpaces(Result))5657TEST(Macros, Cat) {58EXPECT_EXPANSION("14", GMOCK_PP_CAT(1, 4));59EXPECT_EXPANSION("+=", GMOCK_PP_CAT(+, =));60}6162TEST(Macros, Narg) {63EXPECT_EXPANSION("1", GMOCK_PP_NARG());64EXPECT_EXPANSION("1", GMOCK_PP_NARG(x));65EXPECT_EXPANSION("2", GMOCK_PP_NARG(x, y));66EXPECT_EXPANSION("3", GMOCK_PP_NARG(x, y, z));67EXPECT_EXPANSION("4", GMOCK_PP_NARG(x, y, z, w));6869EXPECT_EXPANSION("0", GMOCK_PP_NARG0());70EXPECT_EXPANSION("1", GMOCK_PP_NARG0(x));71EXPECT_EXPANSION("2", GMOCK_PP_NARG0(x, y));72}7374TEST(Macros, Comma) {75EXPECT_EXPANSION("0", GMOCK_PP_HAS_COMMA());76EXPECT_EXPANSION("1", GMOCK_PP_HAS_COMMA(, ));77EXPECT_EXPANSION("0", GMOCK_PP_HAS_COMMA((, )));78}7980TEST(Macros, IsEmpty) {81EXPECT_EXPANSION("1", GMOCK_PP_IS_EMPTY());82EXPECT_EXPANSION("0", GMOCK_PP_IS_EMPTY(, ));83EXPECT_EXPANSION("0", GMOCK_PP_IS_EMPTY(a));84EXPECT_EXPANSION("0", GMOCK_PP_IS_EMPTY(()));8586#define GMOCK_PP_INTERNAL_IS_EMPTY_TEST_187EXPECT_EXPANSION("1", GMOCK_PP_IS_EMPTY(GMOCK_PP_INTERNAL_IS_EMPTY_TEST_1));88}8990TEST(Macros, If) {91EXPECT_EXPANSION("1", GMOCK_PP_IF(1, 1, 2));92EXPECT_EXPANSION("2", GMOCK_PP_IF(0, 1, 2));93}9495TEST(Macros, HeadTail) {96EXPECT_EXPANSION("1", GMOCK_PP_HEAD(1));97EXPECT_EXPANSION("1", GMOCK_PP_HEAD(1, 2));98EXPECT_EXPANSION("1", GMOCK_PP_HEAD(1, 2, 3));99100EXPECT_EXPANSION("", GMOCK_PP_TAIL(1));101EXPECT_EXPANSION("2", GMOCK_PP_TAIL(1, 2));102EXPECT_EXPANSION("2", GMOCK_PP_HEAD(GMOCK_PP_TAIL(1, 2, 3)));103}104105TEST(Macros, Parentheses) {106EXPECT_EXPANSION("0", GMOCK_PP_IS_BEGIN_PARENS(sss));107EXPECT_EXPANSION("0", GMOCK_PP_IS_BEGIN_PARENS(sss()));108EXPECT_EXPANSION("0", GMOCK_PP_IS_BEGIN_PARENS(sss() sss));109EXPECT_EXPANSION("1", GMOCK_PP_IS_BEGIN_PARENS((sss)));110EXPECT_EXPANSION("1", GMOCK_PP_IS_BEGIN_PARENS((sss)ss));111112EXPECT_EXPANSION("0", GMOCK_PP_IS_ENCLOSED_PARENS(sss));113EXPECT_EXPANSION("0", GMOCK_PP_IS_ENCLOSED_PARENS(sss()));114EXPECT_EXPANSION("0", GMOCK_PP_IS_ENCLOSED_PARENS(sss() sss));115EXPECT_EXPANSION("1", GMOCK_PP_IS_ENCLOSED_PARENS((sss)));116EXPECT_EXPANSION("0", GMOCK_PP_IS_ENCLOSED_PARENS((sss)ss));117118EXPECT_EXPANSION("1 + 1", GMOCK_PP_REMOVE_PARENS((1 + 1)));119}120121TEST(Macros, Increment) {122EXPECT_EXPANSION("1", GMOCK_PP_INC(0));123EXPECT_EXPANSION("2", GMOCK_PP_INC(1));124EXPECT_EXPANSION("3", GMOCK_PP_INC(2));125EXPECT_EXPANSION("4", GMOCK_PP_INC(3));126EXPECT_EXPANSION("5", GMOCK_PP_INC(4));127128EXPECT_EXPANSION("16", GMOCK_PP_INC(15));129}130131#define JOINER_CAT(a, b) a##b132#define JOINER(_N, _Data, _Elem) JOINER_CAT(_Data, _N) = _Elem133134TEST(Macros, Repeat) {135EXPECT_EXPANSION("", GMOCK_PP_REPEAT(JOINER, X, 0));136EXPECT_EXPANSION("X0=", GMOCK_PP_REPEAT(JOINER, X, 1));137EXPECT_EXPANSION("X0= X1=", GMOCK_PP_REPEAT(JOINER, X, 2));138EXPECT_EXPANSION("X0= X1= X2=", GMOCK_PP_REPEAT(JOINER, X, 3));139EXPECT_EXPANSION("X0= X1= X2= X3=", GMOCK_PP_REPEAT(JOINER, X, 4));140EXPECT_EXPANSION("X0= X1= X2= X3= X4=", GMOCK_PP_REPEAT(JOINER, X, 5));141EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5=", GMOCK_PP_REPEAT(JOINER, X, 6));142EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6=",143GMOCK_PP_REPEAT(JOINER, X, 7));144EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6= X7=",145GMOCK_PP_REPEAT(JOINER, X, 8));146EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6= X7= X8=",147GMOCK_PP_REPEAT(JOINER, X, 9));148EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6= X7= X8= X9=",149GMOCK_PP_REPEAT(JOINER, X, 10));150EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6= X7= X8= X9= X10=",151GMOCK_PP_REPEAT(JOINER, X, 11));152EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6= X7= X8= X9= X10= X11=",153GMOCK_PP_REPEAT(JOINER, X, 12));154EXPECT_EXPANSION("X0= X1= X2= X3= X4= X5= X6= X7= X8= X9= X10= X11= X12=",155GMOCK_PP_REPEAT(JOINER, X, 13));156EXPECT_EXPANSION(157"X0= X1= X2= X3= X4= X5= X6= X7= X8= X9= X10= X11= X12= X13=",158GMOCK_PP_REPEAT(JOINER, X, 14));159EXPECT_EXPANSION(160"X0= X1= X2= X3= X4= X5= X6= X7= X8= X9= X10= X11= X12= X13= X14=",161GMOCK_PP_REPEAT(JOINER, X, 15));162}163TEST(Macros, ForEach) {164EXPECT_EXPANSION("", GMOCK_PP_FOR_EACH(JOINER, X, ()));165EXPECT_EXPANSION("X0=a", GMOCK_PP_FOR_EACH(JOINER, X, (a)));166EXPECT_EXPANSION("X0=a X1=b", GMOCK_PP_FOR_EACH(JOINER, X, (a, b)));167EXPECT_EXPANSION("X0=a X1=b X2=c", GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c)));168EXPECT_EXPANSION("X0=a X1=b X2=c X3=d",169GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d)));170EXPECT_EXPANSION("X0=a X1=b X2=c X3=d X4=e",171GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e)));172EXPECT_EXPANSION("X0=a X1=b X2=c X3=d X4=e X5=f",173GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f)));174EXPECT_EXPANSION("X0=a X1=b X2=c X3=d X4=e X5=f X6=g",175GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g)));176EXPECT_EXPANSION("X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h",177GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h)));178EXPECT_EXPANSION("X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h X8=i",179GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h, i)));180EXPECT_EXPANSION(181"X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h X8=i X9=j",182GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h, i, j)));183EXPECT_EXPANSION(184"X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h X8=i X9=j X10=k",185GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h, i, j, k)));186EXPECT_EXPANSION(187"X0=a X1=b X2=c X3=d X4=e X5=f X6=g X7=h X8=i X9=j X10=k X11=l",188GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h, i, j, k, l)));189EXPECT_EXPANSION(190"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",191GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h, i, j, k, l, m)));192EXPECT_EXPANSION(193"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 "194"X13=n",195GMOCK_PP_FOR_EACH(JOINER, X, (a, b, c, d, e, f, g, h, i, j, k, l, m, n)));196EXPECT_EXPANSION(197"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 "198"X13=n X14=o",199GMOCK_PP_FOR_EACH(JOINER, X,200(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)));201}202203} // namespace204} // namespace testing205206207