1*5934a791SAdam Czachorowski //===-- ExpandMacroTests.cpp ------------------------------------*- C++ -*-===//
2*5934a791SAdam Czachorowski //
3*5934a791SAdam Czachorowski // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5934a791SAdam Czachorowski // See https://llvm.org/LICENSE.txt for license information.
5*5934a791SAdam Czachorowski // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5934a791SAdam Czachorowski //
7*5934a791SAdam Czachorowski //===----------------------------------------------------------------------===//
8*5934a791SAdam Czachorowski
9*5934a791SAdam Czachorowski #include "TweakTesting.h"
10*5934a791SAdam Czachorowski #include "gmock/gmock.h"
11*5934a791SAdam Czachorowski #include "gtest/gtest.h"
12*5934a791SAdam Czachorowski
13*5934a791SAdam Czachorowski namespace clang {
14*5934a791SAdam Czachorowski namespace clangd {
15*5934a791SAdam Czachorowski namespace {
16*5934a791SAdam Czachorowski
17*5934a791SAdam Czachorowski TWEAK_TEST(ExpandMacro);
18*5934a791SAdam Czachorowski
TEST_F(ExpandMacroTest,Test)19*5934a791SAdam Czachorowski TEST_F(ExpandMacroTest, Test) {
20*5934a791SAdam Czachorowski Header = R"cpp(
21*5934a791SAdam Czachorowski // error-ok: not real c++, just token manipulation
22*5934a791SAdam Czachorowski #define FOO 1 2 3
23*5934a791SAdam Czachorowski #define FUNC(X) X+X+X
24*5934a791SAdam Czachorowski #define EMPTY
25*5934a791SAdam Czachorowski #define EMPTY_FN(X)
26*5934a791SAdam Czachorowski )cpp";
27*5934a791SAdam Czachorowski
28*5934a791SAdam Czachorowski // Available on macro names, not available anywhere else.
29*5934a791SAdam Czachorowski EXPECT_AVAILABLE("^F^O^O^ BAR ^F^O^O^");
30*5934a791SAdam Czachorowski EXPECT_AVAILABLE("^F^U^N^C^(1)");
31*5934a791SAdam Czachorowski EXPECT_UNAVAILABLE("^#^d^efine^ ^XY^Z 1 ^2 ^3^");
32*5934a791SAdam Czachorowski EXPECT_UNAVAILABLE("FOO ^B^A^R^ FOO ^");
33*5934a791SAdam Czachorowski EXPECT_UNAVAILABLE("FUNC(^1^)^");
34*5934a791SAdam Czachorowski
35*5934a791SAdam Czachorowski // Works as expected on object-like macros.
36*5934a791SAdam Czachorowski EXPECT_EQ(apply("^FOO BAR FOO"), "1 2 3 BAR FOO");
37*5934a791SAdam Czachorowski EXPECT_EQ(apply("FOO BAR ^FOO"), "FOO BAR 1 2 3");
38*5934a791SAdam Czachorowski // And function-like macros.
39*5934a791SAdam Czachorowski EXPECT_EQ(apply("F^UNC(2)"), "2 + 2 + 2");
40*5934a791SAdam Czachorowski
41*5934a791SAdam Czachorowski // Works on empty macros.
42*5934a791SAdam Czachorowski EXPECT_EQ(apply("int a ^EMPTY;"), "int a ;");
43*5934a791SAdam Czachorowski EXPECT_EQ(apply("int a ^EMPTY_FN(1 2 3);"), "int a ;");
44*5934a791SAdam Czachorowski EXPECT_EQ(apply("int a = 123 ^EMPTY EMPTY_FN(1);"),
45*5934a791SAdam Czachorowski "int a = 123 EMPTY_FN(1);");
46*5934a791SAdam Czachorowski EXPECT_EQ(apply("int a = 123 ^EMPTY_FN(1) EMPTY;"), "int a = 123 EMPTY;");
47*5934a791SAdam Czachorowski EXPECT_EQ(apply("int a = 123 EMPTY_FN(1) ^EMPTY;"),
48*5934a791SAdam Czachorowski "int a = 123 EMPTY_FN(1) ;");
49*5934a791SAdam Czachorowski }
50*5934a791SAdam Czachorowski
51*5934a791SAdam Czachorowski } // namespace
52*5934a791SAdam Czachorowski } // namespace clangd
53*5934a791SAdam Czachorowski } // namespace clang
54