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)