| // | |
| // 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 VersionTest : public SimplePreprocessorTest | |
| { | |
| }; | |
| TEST_F(VersionTest, Valid) | |
| { | |
| const char* str = "#version 200\n"; | |
| const char* expected = "\n"; | |
| using testing::_; | |
| EXPECT_CALL(mDirectiveHandler, | |
| handleVersion(pp::SourceLocation(0, 1), 200)); | |
| // No error or warning. | |
| EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); | |
| preprocess(str, expected); | |
| } | |
| TEST_F(VersionTest, CommentsIgnored) | |
| { | |
| const char* str = "/*foo*/" | |
| "#" | |
| "/*foo*/" | |
| "version" | |
| "/*foo*/" | |
| "200" | |
| "/*foo*/" | |
| "//foo" | |
| "\n"; | |
| const char* expected = "\n"; | |
| using testing::_; | |
| EXPECT_CALL(mDirectiveHandler, | |
| handleVersion(pp::SourceLocation(0, 1), 200)); | |
| // No error or warning. | |
| EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); | |
| preprocess(str, expected); | |
| } | |
| TEST_F(VersionTest, MissingNewline) | |
| { | |
| const char* str = "#version 200"; | |
| const char* expected = ""; | |
| using testing::_; | |
| // Directive successfully parsed. | |
| EXPECT_CALL(mDirectiveHandler, | |
| handleVersion(pp::SourceLocation(0, 1), 200)); | |
| // Error reported about EOF. | |
| EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_EOF_IN_DIRECTIVE, _, _)); | |
| preprocess(str, expected); | |
| } | |
| TEST_F(VersionTest, AfterComments) | |
| { | |
| const char* str = "/* block comment acceptable */\n" | |
| "// line comment acceptable\n" | |
| "#version 200\n"; | |
| const char* expected = "\n\n\n"; | |
| using testing::_; | |
| // Directive successfully parsed. | |
| EXPECT_CALL(mDirectiveHandler, | |
| handleVersion(pp::SourceLocation(0, 3), 200)); | |
| // No error or warning. | |
| EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); | |
| preprocess(str, expected); | |
| } | |
| TEST_F(VersionTest, AfterWhitespace) | |
| { | |
| const char* str = "\n" | |
| "\n" | |
| "#version 200\n"; | |
| const char* expected = "\n\n\n"; | |
| using testing::_; | |
| // Directive successfully parsed. | |
| EXPECT_CALL(mDirectiveHandler, | |
| handleVersion(pp::SourceLocation(0, 3), 200)); | |
| // No error or warning. | |
| EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); | |
| preprocess(str, expected); | |
| } | |
| TEST_F(VersionTest, AfterValidToken) | |
| { | |
| const char* str = "foo\n" | |
| "#version 200\n"; | |
| using testing::_; | |
| EXPECT_CALL(mDiagnostics, | |
| print(pp::Diagnostics::PP_VERSION_NOT_FIRST_STATEMENT, | |
| pp::SourceLocation(0, 2), _)); | |
| preprocess(str); | |
| } | |
| TEST_F(VersionTest, AfterInvalidToken) | |
| { | |
| const char* str = "$\n" | |
| "#version 200\n"; | |
| using testing::_; | |
| EXPECT_CALL(mDiagnostics, | |
| print(pp::Diagnostics::PP_INVALID_CHARACTER, | |
| pp::SourceLocation(0, 1), "$")); | |
| EXPECT_CALL(mDiagnostics, | |
| print(pp::Diagnostics::PP_VERSION_NOT_FIRST_STATEMENT, | |
| pp::SourceLocation(0, 2), _)); | |
| preprocess(str); | |
| } | |
| TEST_F(VersionTest, AfterValidDirective) | |
| { | |
| const char* str = "#\n" | |
| "#version 200\n"; | |
| using testing::_; | |
| EXPECT_CALL(mDiagnostics, | |
| print(pp::Diagnostics::PP_VERSION_NOT_FIRST_STATEMENT, | |
| pp::SourceLocation(0, 2), _)); | |
| preprocess(str); | |
| } | |
| TEST_F(VersionTest, AfterInvalidDirective) | |
| { | |
| const char* str = "#foo\n" | |
| "#version 200\n"; | |
| using testing::_; | |
| EXPECT_CALL(mDiagnostics, | |
| print(pp::Diagnostics::PP_DIRECTIVE_INVALID_NAME, | |
| pp::SourceLocation(0, 1), "foo")); | |
| EXPECT_CALL(mDiagnostics, | |
| print(pp::Diagnostics::PP_VERSION_NOT_FIRST_STATEMENT, | |
| pp::SourceLocation(0, 2), _)); | |
| preprocess(str); | |
| } | |
| TEST_F(VersionTest, AfterExcludedBlock) | |
| { | |
| const char* str = "#if 0\n" | |
| "foo\n" | |
| "#endif\n" | |
| "#version 200\n"; | |
| using testing::_; | |
| EXPECT_CALL(mDiagnostics, | |
| print(pp::Diagnostics::PP_VERSION_NOT_FIRST_STATEMENT, | |
| pp::SourceLocation(0, 4), _)); | |
| preprocess(str); | |
| } | |
| struct VersionTestParam | |
| { | |
| const char* str; | |
| pp::Diagnostics::ID id; | |
| }; | |
| class InvalidVersionTest : public VersionTest, | |
| public testing::WithParamInterface<VersionTestParam> | |
| { | |
| }; | |
| TEST_P(InvalidVersionTest, Identified) | |
| { | |
| VersionTestParam param = GetParam(); | |
| const char* expected = "\n"; | |
| using testing::_; | |
| // No handleVersion call. | |
| EXPECT_CALL(mDirectiveHandler, handleVersion(_, _)).Times(0); | |
| // Invalid version directive call. | |
| EXPECT_CALL(mDiagnostics, print(param.id, pp::SourceLocation(0, 1), _)); | |
| preprocess(param.str, expected); | |
| } | |
| static const VersionTestParam kParams[] = { | |
| {"#version\n", pp::Diagnostics::PP_INVALID_VERSION_DIRECTIVE}, | |
| {"#version foo\n", pp::Diagnostics::PP_INVALID_VERSION_NUMBER}, | |
| {"#version 100 foo\n", pp::Diagnostics::PP_UNEXPECTED_TOKEN}, | |
| {"#version 0xffffffff\n", pp::Diagnostics::PP_INTEGER_OVERFLOW} | |
| }; | |
| INSTANTIATE_TEST_CASE_P(All, InvalidVersionTest, testing::ValuesIn(kParams)); |