| // | |
| // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| #include "PreprocessorTest.h" | |
| #include "compiler/preprocessor/Token.h" | |
| class PragmaTest : public SimplePreprocessorTest | |
| { | |
| }; | |
| TEST_F(PragmaTest, EmptyName) | |
| { | |
| const char* str = "#pragma\n"; | |
| const char* expected = "\n"; | |
| using testing::_; | |
| // No handlePragma calls. | |
| EXPECT_CALL(mDirectiveHandler, handlePragma(_, _, _, false)).Times(0); | |
| // No error or warning. | |
| EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); | |
| preprocess(str, expected); | |
| } | |
| TEST_F(PragmaTest, EmptyValue) | |
| { | |
| const char* str = "#pragma foo\n"; | |
| const char* expected = "\n"; | |
| using testing::_; | |
| EXPECT_CALL(mDirectiveHandler, | |
| handlePragma(pp::SourceLocation(0, 1), "foo", "", false)); | |
| // No error or warning. | |
| EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); | |
| preprocess(str, expected); | |
| } | |
| TEST_F(PragmaTest, NameValue) | |
| { | |
| const char* str = "#pragma foo(bar)\n"; | |
| const char* expected = "\n"; | |
| using testing::_; | |
| EXPECT_CALL(mDirectiveHandler, | |
| handlePragma(pp::SourceLocation(0, 1), "foo", "bar", false)); | |
| // No error or warning. | |
| EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); | |
| preprocess(str, expected); | |
| } | |
| TEST_F(PragmaTest, STDGL) | |
| { | |
| const char* str = "#pragma STDGL\n"; | |
| const char* expected = "\n"; | |
| using testing::_; | |
| EXPECT_CALL(mDirectiveHandler, | |
| handlePragma(_, _, _, _)).Times(0); | |
| // No error or warning. | |
| EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); | |
| preprocess(str, expected); | |
| } | |
| TEST_F(PragmaTest, STDGLInvariantAll) | |
| { | |
| const char* str = "#pragma STDGL invariant(all)\n"; | |
| const char* expected = "\n"; | |
| using testing::_; | |
| EXPECT_CALL(mDirectiveHandler, | |
| handlePragma(pp::SourceLocation(0, 1), "invariant", "all", true)); | |
| // No error or warning. | |
| EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); | |
| preprocess(str, expected); | |
| } | |
| TEST_F(PragmaTest, Comments) | |
| { | |
| const char* str = "/*foo*/" | |
| "#" | |
| "/*foo*/" | |
| "pragma" | |
| "/*foo*/" | |
| "foo" | |
| "/*foo*/" | |
| "(" | |
| "/*foo*/" | |
| "bar" | |
| "/*foo*/" | |
| ")" | |
| "/*foo*/" | |
| "//foo" | |
| "\n"; | |
| const char* expected = "\n"; | |
| using testing::_; | |
| EXPECT_CALL(mDirectiveHandler, | |
| handlePragma(pp::SourceLocation(0, 1), "foo", "bar", false)); | |
| // No error or warning. | |
| EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); | |
| preprocess(str, expected); | |
| } | |
| TEST_F(PragmaTest, MissingNewline) | |
| { | |
| const char* str = "#pragma foo(bar)"; | |
| const char* expected = ""; | |
| using testing::_; | |
| // Pragma successfully parsed. | |
| EXPECT_CALL(mDirectiveHandler, | |
| handlePragma(pp::SourceLocation(0, 1), "foo", "bar", false)); | |
| // Error reported about EOF. | |
| EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_EOF_IN_DIRECTIVE, _, _)); | |
| preprocess(str, expected); | |
| } | |
| class InvalidPragmaTest : public PragmaTest, | |
| public testing::WithParamInterface<const char*> | |
| { | |
| }; | |
| TEST_P(InvalidPragmaTest, Identified) | |
| { | |
| const char* str = GetParam(); | |
| const char* expected = "\n"; | |
| using testing::_; | |
| // No handlePragma calls. | |
| EXPECT_CALL(mDirectiveHandler, handlePragma(_, _, _, false)).Times(0); | |
| // Unrecognized pragma warning. | |
| EXPECT_CALL(mDiagnostics, | |
| print(pp::Diagnostics::PP_UNRECOGNIZED_PRAGMA, | |
| pp::SourceLocation(0, 1), _)); | |
| preprocess(str, expected); | |
| } | |
| INSTANTIATE_TEST_CASE_P(All, InvalidPragmaTest, testing::Values( | |
| "#pragma 1\n", // Invalid name. | |
| "#pragma foo()\n", // Missing value. | |
| "#pragma foo bar)\n", // Missing left paren, | |
| "#pragma foo(bar\n", // Missing right paren. | |
| "#pragma foo bar\n", // Missing parens. | |
| "#pragma foo(bar) baz\n")); // Extra tokens. |