1 //
2 // Copyright 2012 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 #include "PreprocessorTest.h"
8 #include "compiler/preprocessor/Token.h"
9 
10 namespace angle
11 {
12 
13 class PragmaTest : public SimplePreprocessorTest
14 {};
15 
TEST_F(PragmaTest,EmptyName)16 TEST_F(PragmaTest, EmptyName)
17 {
18     const char *str      = "#pragma\n";
19     const char *expected = "\n";
20 
21     using testing::_;
22     // No handlePragma calls.
23     EXPECT_CALL(mDirectiveHandler, handlePragma(_, _, _, false)).Times(0);
24     // No error or warning.
25     EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0);
26 
27     preprocess(str, expected);
28 }
29 
TEST_F(PragmaTest,EmptyValue)30 TEST_F(PragmaTest, EmptyValue)
31 {
32     const char *str      = "#pragma foo\n";
33     const char *expected = "\n";
34 
35     using testing::_;
36     EXPECT_CALL(mDirectiveHandler, handlePragma(pp::SourceLocation(0, 1), "foo", "", false));
37     // No error or warning.
38     EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0);
39 
40     preprocess(str, expected);
41 }
42 
TEST_F(PragmaTest,NameValue)43 TEST_F(PragmaTest, NameValue)
44 {
45     const char *str      = "#pragma foo(bar)\n";
46     const char *expected = "\n";
47 
48     using testing::_;
49     EXPECT_CALL(mDirectiveHandler, handlePragma(pp::SourceLocation(0, 1), "foo", "bar", false));
50     // No error or warning.
51     EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0);
52 
53     preprocess(str, expected);
54 }
55 
TEST_F(PragmaTest,STDGL)56 TEST_F(PragmaTest, STDGL)
57 {
58     const char *str      = "#pragma STDGL\n";
59     const char *expected = "\n";
60 
61     using testing::_;
62     EXPECT_CALL(mDirectiveHandler, handlePragma(_, _, _, _)).Times(0);
63     // No error or warning.
64     EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0);
65 
66     preprocess(str, expected);
67 }
68 
TEST_F(PragmaTest,STDGLInvariantAll)69 TEST_F(PragmaTest, STDGLInvariantAll)
70 {
71     const char *str      = "#pragma STDGL invariant(all)\n";
72     const char *expected = "\n";
73 
74     using testing::_;
75     EXPECT_CALL(mDirectiveHandler,
76                 handlePragma(pp::SourceLocation(0, 1), "invariant", "all", true));
77     // No error or warning.
78     EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0);
79 
80     preprocess(str, expected);
81 }
82 
TEST_F(PragmaTest,Comments)83 TEST_F(PragmaTest, Comments)
84 {
85     const char *str =
86         "/*foo*/"
87         "#"
88         "/*foo*/"
89         "pragma"
90         "/*foo*/"
91         "foo"
92         "/*foo*/"
93         "("
94         "/*foo*/"
95         "bar"
96         "/*foo*/"
97         ")"
98         "/*foo*/"
99         "//foo"
100         "\n";
101     const char *expected = "\n";
102 
103     using testing::_;
104     EXPECT_CALL(mDirectiveHandler, handlePragma(pp::SourceLocation(0, 1), "foo", "bar", false));
105     // No error or warning.
106     EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0);
107 
108     preprocess(str, expected);
109 }
110 
TEST_F(PragmaTest,MissingNewline)111 TEST_F(PragmaTest, MissingNewline)
112 {
113     const char *str      = "#pragma foo(bar)";
114     const char *expected = "";
115 
116     using testing::_;
117     // Pragma successfully parsed.
118     EXPECT_CALL(mDirectiveHandler, handlePragma(pp::SourceLocation(0, 1), "foo", "bar", false));
119     // Error reported about EOF.
120     EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_EOF_IN_DIRECTIVE, _, _));
121 
122     preprocess(str, expected);
123 }
124 
125 class InvalidPragmaTest : public PragmaTest, public testing::WithParamInterface<const char *>
126 {};
127 
TEST_P(InvalidPragmaTest,Identified)128 TEST_P(InvalidPragmaTest, Identified)
129 {
130     const char *str      = GetParam();
131     const char *expected = "\n";
132 
133     using testing::_;
134     // No handlePragma calls.
135     EXPECT_CALL(mDirectiveHandler, handlePragma(_, _, _, false)).Times(0);
136     // Unrecognized pragma warning.
137     EXPECT_CALL(mDiagnostics,
138                 print(pp::Diagnostics::PP_UNRECOGNIZED_PRAGMA, pp::SourceLocation(0, 1), _));
139 
140     preprocess(str, expected);
141 }
142 
143 INSTANTIATE_TEST_SUITE_P(All,
144                          InvalidPragmaTest,
145                          testing::Values("#pragma 1\n",               // Invalid name.
146                                          "#pragma foo()\n",           // Missing value.
147                                          "#pragma foo bar)\n",        // Missing left paren,
148                                          "#pragma foo(bar\n",         // Missing right paren.
149                                          "#pragma foo bar\n",         // Missing parens.
150                                          "#pragma foo(bar) baz\n"));  // Extra tokens.
151 
152 }  // namespace angle
153