| // |
| // Copyright 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" |
| |
| namespace angle |
| { |
| |
| class ExtensionTest : public SimplePreprocessorTest |
| {}; |
| |
| TEST_F(ExtensionTest, Valid) |
| { |
| const char *str = "#extension foo : bar\n"; |
| const char *expected = "\n"; |
| |
| using testing::_; |
| EXPECT_CALL(mDirectiveHandler, handleExtension(pp::SourceLocation(0, 1), "foo", "bar")); |
| // No error or warning. |
| EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); |
| |
| preprocess(str, expected); |
| } |
| |
| TEST_F(ExtensionTest, Comments) |
| { |
| const char *str = |
| "/*foo*/" |
| "#" |
| "/*foo*/" |
| "extension" |
| "/*foo*/" |
| "foo" |
| "/*foo*/" |
| ":" |
| "/*foo*/" |
| "bar" |
| "/*foo*/" |
| "//foo" |
| "\n"; |
| const char *expected = "\n"; |
| |
| using testing::_; |
| EXPECT_CALL(mDirectiveHandler, handleExtension(pp::SourceLocation(0, 1), "foo", "bar")); |
| // No error or warning. |
| EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); |
| |
| preprocess(str, expected); |
| } |
| |
| TEST_F(ExtensionTest, MissingNewline) |
| { |
| const char *str = "#extension foo : bar"; |
| const char *expected = ""; |
| |
| using testing::_; |
| // Directive successfully parsed. |
| EXPECT_CALL(mDirectiveHandler, handleExtension(pp::SourceLocation(0, 1), "foo", "bar")); |
| // Error reported about EOF. |
| EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_EOF_IN_DIRECTIVE, _, _)); |
| |
| preprocess(str, expected); |
| } |
| |
| TEST_F(ExtensionTest, ExtensionAfterNonPreProcessorTokenESSL1) |
| { |
| const char *str = |
| "int baz = 1;\n" |
| "#extension foo : bar\n"; |
| const char *expected = "int baz = 1;\n\n"; |
| |
| using testing::_; |
| // Expect an error about extension pragmas after non-preprocessor tokens. |
| EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL, _, _)); |
| |
| preprocess(str, expected); |
| } |
| |
| TEST_F(ExtensionTest, ExtensionAfterNonPreProcessorTokenESSL3) |
| { |
| const char *str = |
| "#version 300 es\n" |
| "int baz = 1;\n" |
| "#extension foo : bar\n"; |
| const char *expected = "\nint baz = 1;\n\n"; |
| |
| using testing::_; |
| // Directive successfully parsed. |
| EXPECT_CALL(mDirectiveHandler, handleVersion(pp::SourceLocation(0, 1), 300, SH_GLES2_SPEC)); |
| // Expect an error about extension pragmas after non-preprocessor tokens. |
| EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL, _, _)); |
| |
| preprocess(str, expected); |
| } |
| |
| struct ExtensionTestParam |
| { |
| const char *str; |
| pp::Diagnostics::ID id; |
| }; |
| |
| using testing::WithParamInterface; |
| class InvalidExtensionTest : public ExtensionTest, public WithParamInterface<ExtensionTestParam> |
| {}; |
| |
| TEST_P(InvalidExtensionTest, Identified) |
| { |
| ExtensionTestParam param = GetParam(); |
| const char *expected = "\n"; |
| |
| using testing::_; |
| // No handleExtension call. |
| EXPECT_CALL(mDirectiveHandler, handleExtension(_, _, _)).Times(0); |
| // Invalid extension directive call. |
| EXPECT_CALL(mDiagnostics, print(param.id, pp::SourceLocation(0, 1), _)); |
| |
| preprocess(param.str, expected); |
| } |
| |
| static const ExtensionTestParam kParams[] = { |
| {"#extension\n", pp::Diagnostics::PP_INVALID_EXTENSION_DIRECTIVE}, |
| {"#extension 1\n", pp::Diagnostics::PP_INVALID_EXTENSION_NAME}, |
| {"#extension foo bar\n", pp::Diagnostics::PP_UNEXPECTED_TOKEN}, |
| {"#extension foo : \n", pp::Diagnostics::PP_INVALID_EXTENSION_DIRECTIVE}, |
| {"#extension foo : 1\n", pp::Diagnostics::PP_INVALID_EXTENSION_BEHAVIOR}, |
| {"#extension foo : bar baz\n", pp::Diagnostics::PP_UNEXPECTED_TOKEN}}; |
| INSTANTIATE_TEST_SUITE_P(All, InvalidExtensionTest, testing::ValuesIn(kParams)); |
| |
| } // namespace angle |