1// 2// Copyright (c) 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 "Token.h" 9 10class ExtensionTest : public PreprocessorTest 11{ 12}; 13 14TEST_F(ExtensionTest, Valid) 15{ 16 const char* str = "#extension foo : bar\n"; 17 const char* expected = "\n"; 18 19 using testing::_; 20 EXPECT_CALL(mDirectiveHandler, 21 handleExtension(pp::SourceLocation(0, 1), "foo", "bar")); 22 // No error or warning. 23 EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); 24 25 preprocess(str, expected); 26} 27 28TEST_F(ExtensionTest, Comments) 29{ 30 const char* str = "/*foo*/" 31 "#" 32 "/*foo*/" 33 "extension" 34 "/*foo*/" 35 "foo" 36 "/*foo*/" 37 ":" 38 "/*foo*/" 39 "bar" 40 "/*foo*/" 41 "//foo" 42 "\n"; 43 const char* expected = "\n"; 44 45 using testing::_; 46 EXPECT_CALL(mDirectiveHandler, 47 handleExtension(pp::SourceLocation(0, 1), "foo", "bar")); 48 // No error or warning. 49 EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); 50 51 preprocess(str, expected); 52} 53 54TEST_F(ExtensionTest, MissingNewline) 55{ 56 const char* str = "#extension foo : bar"; 57 const char* expected = ""; 58 59 using testing::_; 60 // Directive successfully parsed. 61 EXPECT_CALL(mDirectiveHandler, 62 handleExtension(pp::SourceLocation(0, 1), "foo", "bar")); 63 // Error reported about EOF. 64 EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_EOF_IN_DIRECTIVE, _, _)); 65 66 preprocess(str, expected); 67} 68 69struct ExtensionTestParam 70{ 71 const char* str; 72 pp::Diagnostics::ID id; 73}; 74 75using testing::WithParamInterface; 76class InvalidExtensionTest : public ExtensionTest, 77 public WithParamInterface<ExtensionTestParam> 78{ 79}; 80 81TEST_P(InvalidExtensionTest, Identified) 82{ 83 ExtensionTestParam param = GetParam(); 84 const char* expected = "\n"; 85 86 using testing::_; 87 // No handleExtension call. 88 EXPECT_CALL(mDirectiveHandler, handleExtension(_, _, _)).Times(0); 89 // Invalid extension directive call. 90 EXPECT_CALL(mDiagnostics, print(param.id, pp::SourceLocation(0, 1), _)); 91 92 preprocess(param.str, expected); 93} 94 95static const ExtensionTestParam kParams[] = { 96 {"#extension\n", pp::Diagnostics::PP_INVALID_EXTENSION_DIRECTIVE}, 97 {"#extension 1\n", pp::Diagnostics::PP_INVALID_EXTENSION_NAME}, 98 {"#extension foo bar\n", pp::Diagnostics::PP_UNEXPECTED_TOKEN}, 99 {"#extension foo : \n", pp::Diagnostics::PP_INVALID_EXTENSION_DIRECTIVE}, 100 {"#extension foo : 1\n", pp::Diagnostics::PP_INVALID_EXTENSION_BEHAVIOR}, 101 {"#extension foo : bar baz\n", pp::Diagnostics::PP_UNEXPECTED_TOKEN} 102}; 103INSTANTIATE_TEST_CASE_P(All, InvalidExtensionTest, testing::ValuesIn(kParams)); 104