15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "PreprocessorTest.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "Token.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PragmaTest : public PreprocessorTest 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PragmaTest, EmptyName) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* str = "#pragma\n"; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected = "\n"; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using testing::_; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No handlePragma calls. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mDirectiveHandler, handlePragma(_, _, _)).Times(0); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No error or warning. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preprocess(str, expected); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PragmaTest, EmptyValue) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* str = "#pragma foo\n"; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected = "\n"; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using testing::_; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mDirectiveHandler, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handlePragma(pp::SourceLocation(0, 1), "foo", "")); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No error or warning. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preprocess(str, expected); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PragmaTest, NameValue) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* str = "#pragma foo(bar)\n"; 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const char* expected = "\n"; 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) using testing::_; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mDirectiveHandler, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handlePragma(pp::SourceLocation(0, 1), "foo", "bar")); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No error or warning. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preprocess(str, expected); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PragmaTest, Comments) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* str = "/*foo*/" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/*foo*/" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pragma" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/*foo*/" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/*foo*/" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "(" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/*foo*/" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bar" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/*foo*/" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ")" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/*foo*/" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "//foo" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\n"; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected = "\n"; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using testing::_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mDirectiveHandler, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handlePragma(pp::SourceLocation(0, 1), "foo", "bar")); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No error or warning. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mDiagnostics, print(_, _, _)).Times(0); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preprocess(str, expected); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PragmaTest, MissingNewline) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* str = "#pragma foo(bar)"; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected = ""; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using testing::_; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pragma successfully parsed. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mDirectiveHandler, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handlePragma(pp::SourceLocation(0, 1), "foo", "bar")); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Error reported about EOF. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_EOF_IN_DIRECTIVE, _, _)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preprocess(str, expected); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InvalidPragmaTest : public PragmaTest, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public testing::WithParamInterface<const char*> 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(InvalidPragmaTest, Identified) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* str = GetParam(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected = "\n"; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using testing::_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No handlePragma calls. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mDirectiveHandler, handlePragma(_, _, _)).Times(0); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unrecognized pragma warning. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mDiagnostics, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print(pp::Diagnostics::PP_UNRECOGNIZED_PRAGMA, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::SourceLocation(0, 1), _)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preprocess(str, expected); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(All, InvalidPragmaTest, testing::Values( 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "#pragma 1\n", // Invalid name. 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "#pragma foo()\n", // Missing value. 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "#pragma foo bar)\n", // Missing left paren, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "#pragma foo(bar\n", // Missing right paren. 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "#pragma foo bar\n", // Missing parens. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "#pragma foo(bar) baz\n")); // Extra tokens. 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)