github.com/maruel/nin@v0.0.0-20220112143044-f35891e3ce7e/src/clparser_test.cc (about)

     1  // Copyright 2011 Google Inc. All Rights Reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  #include "clparser.h"
    16  
    17  #include "test.h"
    18  #include "util.h"
    19  
    20  using namespace std;
    21  
    22  TEST(CLParserTest, ShowIncludes) {
    23    ASSERT_EQ("", CLParser::FilterShowIncludes("", ""));
    24  
    25    ASSERT_EQ("", CLParser::FilterShowIncludes("Sample compiler output", ""));
    26    ASSERT_EQ("c:\\Some Files\\foobar.h",
    27              CLParser::FilterShowIncludes("Note: including file: "
    28                                           "c:\\Some Files\\foobar.h", ""));
    29    ASSERT_EQ("c:\\initspaces.h",
    30              CLParser::FilterShowIncludes("Note: including file:    "
    31                                           "c:\\initspaces.h", ""));
    32    ASSERT_EQ("c:\\initspaces.h",
    33              CLParser::FilterShowIncludes("Non-default prefix: inc file:    "
    34                                           "c:\\initspaces.h",
    35                      "Non-default prefix: inc file:"));
    36  }
    37  
    38  TEST(CLParserTest, FilterInputFilename) {
    39    ASSERT_TRUE(CLParser::FilterInputFilename("foobar.cc"));
    40    ASSERT_TRUE(CLParser::FilterInputFilename("foo bar.cc"));
    41    ASSERT_TRUE(CLParser::FilterInputFilename("baz.c"));
    42    ASSERT_TRUE(CLParser::FilterInputFilename("FOOBAR.CC"));
    43  
    44    ASSERT_FALSE(CLParser::FilterInputFilename(
    45                     "src\\cl_helper.cc(166) : fatal error C1075: end "
    46                     "of file found ..."));
    47  }
    48  
    49  TEST(CLParserTest, ParseSimple) {
    50    CLParser parser;
    51    string output, err;
    52    ASSERT_TRUE(parser.Parse(
    53        "foo\r\n"
    54        "Note: inc file prefix:  foo.h\r\n"
    55        "bar\r\n",
    56        "Note: inc file prefix:", &output, &err));
    57  
    58    ASSERT_EQ("foo\nbar\n", output);
    59    ASSERT_EQ(1u, parser.includes_.size());
    60    ASSERT_EQ("foo.h", *parser.includes_.begin());
    61  }
    62  
    63  TEST(CLParserTest, ParseFilenameFilter) {
    64    CLParser parser;
    65    string output, err;
    66    ASSERT_TRUE(parser.Parse(
    67        "foo.cc\r\n"
    68        "cl: warning\r\n",
    69        "", &output, &err));
    70    ASSERT_EQ("cl: warning\n", output);
    71  }
    72  
    73  TEST(CLParserTest, NoFilenameFilterAfterShowIncludes) {
    74    CLParser parser;
    75    string output, err;
    76    ASSERT_TRUE(parser.Parse(
    77        "foo.cc\r\n"
    78        "Note: including file: foo.h\r\n"
    79        "something something foo.cc\r\n",
    80        "", &output, &err));
    81    ASSERT_EQ("something something foo.cc\n", output);
    82  }
    83  
    84  TEST(CLParserTest, ParseSystemInclude) {
    85    CLParser parser;
    86    string output, err;
    87    ASSERT_TRUE(parser.Parse(
    88        "Note: including file: c:\\Program Files\\foo.h\r\n"
    89        "Note: including file: d:\\Microsoft Visual Studio\\bar.h\r\n"
    90        "Note: including file: path.h\r\n",
    91        "", &output, &err));
    92    // We should have dropped the first two includes because they look like
    93    // system headers.
    94    ASSERT_EQ("", output);
    95    ASSERT_EQ(1u, parser.includes_.size());
    96    ASSERT_EQ("path.h", *parser.includes_.begin());
    97  }
    98  
    99  TEST(CLParserTest, DuplicatedHeader) {
   100    CLParser parser;
   101    string output, err;
   102    ASSERT_TRUE(parser.Parse(
   103        "Note: including file: foo.h\r\n"
   104        "Note: including file: bar.h\r\n"
   105        "Note: including file: foo.h\r\n",
   106        "", &output, &err));
   107    // We should have dropped one copy of foo.h.
   108    ASSERT_EQ("", output);
   109    ASSERT_EQ(2u, parser.includes_.size());
   110  }
   111  
   112  TEST(CLParserTest, DuplicatedHeaderPathConverted) {
   113    CLParser parser;
   114    string output, err;
   115  
   116    // This isn't inline in the Parse() call below because the #ifdef in
   117    // a macro expansion would confuse MSVC2013's preprocessor.
   118    const char kInput[] =
   119        "Note: including file: sub/./foo.h\r\n"
   120        "Note: including file: bar.h\r\n"
   121  #ifdef _WIN32
   122        "Note: including file: sub\\foo.h\r\n";
   123  #else
   124        "Note: including file: sub/foo.h\r\n";
   125  #endif
   126    ASSERT_TRUE(parser.Parse(kInput, "", &output, &err));
   127    // We should have dropped one copy of foo.h.
   128    ASSERT_EQ("", output);
   129    ASSERT_EQ(2u, parser.includes_.size());
   130  }