diff options
Diffstat (limited to 'Source/ThirdParty/ANGLE/src/tests/preprocessor_tests/pragma_test.cpp')
-rw-r--r-- | Source/ThirdParty/ANGLE/src/tests/preprocessor_tests/pragma_test.cpp | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/Source/ThirdParty/ANGLE/src/tests/preprocessor_tests/pragma_test.cpp b/Source/ThirdParty/ANGLE/src/tests/preprocessor_tests/pragma_test.cpp new file mode 100644 index 000000000..92992aced --- /dev/null +++ b/Source/ThirdParty/ANGLE/src/tests/preprocessor_tests/pragma_test.cpp @@ -0,0 +1,154 @@ +// +// 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 PreprocessorTest +{ +}; + +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. |