tools/pcre/pcre_scanner_unittest.cc
author Nicholas Hastings <skamonkey@gmail.com>
Sun Jul 15 12:31:06 2012 -0400 (2012-07-15)
changeset 3579 6d730190a3e4
parent 2762 d2d467bf1b5a
child 3831 babd0eee3c5e
permissions -rw-r--r--
Added missing files to each core and logic makefiles (NPOTB).
dvander@2762
     1
// Copyright (c) 2005, Google Inc.
dvander@2762
     2
// All rights reserved.
dvander@2762
     3
//
dvander@2762
     4
// Redistribution and use in source and binary forms, with or without
dvander@2762
     5
// modification, are permitted provided that the following conditions are
dvander@2762
     6
// met:
dvander@2762
     7
//
dvander@2762
     8
//     * Redistributions of source code must retain the above copyright
dvander@2762
     9
// notice, this list of conditions and the following disclaimer.
dvander@2762
    10
//     * Redistributions in binary form must reproduce the above
dvander@2762
    11
// copyright notice, this list of conditions and the following disclaimer
dvander@2762
    12
// in the documentation and/or other materials provided with the
dvander@2762
    13
// distribution.
dvander@2762
    14
//     * Neither the name of Google Inc. nor the names of its
dvander@2762
    15
// contributors may be used to endorse or promote products derived from
dvander@2762
    16
// this software without specific prior written permission.
dvander@2762
    17
//
dvander@2762
    18
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dvander@2762
    19
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dvander@2762
    20
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dvander@2762
    21
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dvander@2762
    22
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dvander@2762
    23
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dvander@2762
    24
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dvander@2762
    25
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dvander@2762
    26
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dvander@2762
    27
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dvander@2762
    28
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dvander@2762
    29
//
dvander@2762
    30
// Author: Greg J. Badros
dvander@2762
    31
//
dvander@2762
    32
// Unittest for scanner, especially GetNextComments and GetComments()
dvander@2762
    33
// functionality.
dvander@2762
    34
dvander@2762
    35
#ifdef HAVE_CONFIG_H
dvander@2762
    36
#include "config.h"
dvander@2762
    37
#endif
dvander@2762
    38
dvander@2762
    39
#include <stdio.h>
dvander@2762
    40
#include <string>
dvander@2762
    41
#include <vector>
dvander@2762
    42
dvander@2762
    43
#include "pcrecpp.h"
dvander@2762
    44
#include "pcre_stringpiece.h"
dvander@2762
    45
#include "pcre_scanner.h"
dvander@2762
    46
dvander@2762
    47
#define FLAGS_unittest_stack_size   49152
dvander@2762
    48
dvander@2762
    49
// Dies with a fatal error if the two values are not equal.
dvander@2762
    50
#define CHECK_EQ(a, b)  do {                                    \
dvander@2762
    51
  if ( (a) != (b) ) {                                           \
dvander@2762
    52
    fprintf(stderr, "%s:%d: Check failed because %s != %s\n",   \
dvander@2762
    53
            __FILE__, __LINE__, #a, #b);                        \
dvander@2762
    54
    exit(1);                                                    \
dvander@2762
    55
  }                                                             \
dvander@2762
    56
} while (0)
dvander@2762
    57
dvander@2762
    58
using std::vector;
dvander@2762
    59
using pcrecpp::StringPiece;
dvander@2762
    60
using pcrecpp::Scanner;
dvander@2762
    61
dvander@2762
    62
static void TestScanner() {
dvander@2762
    63
  const char input[] = "\n"
dvander@2762
    64
                       "alpha = 1; // this sets alpha\n"
dvander@2762
    65
                       "bravo = 2; // bravo is set here\n"
dvander@2762
    66
                       "gamma = 33; /* and here is gamma */\n";
dvander@2762
    67
dvander@2762
    68
  const char *re = "(\\w+) = (\\d+);";
dvander@2762
    69
dvander@2762
    70
  Scanner s(input);
dvander@2762
    71
  string var;
dvander@2762
    72
  int number;
dvander@2762
    73
  s.SkipCXXComments();
dvander@2762
    74
  s.set_save_comments(true);
dvander@2762
    75
  vector<StringPiece> comments;
dvander@2762
    76
dvander@2762
    77
  s.Consume(re, &var, &number);
dvander@2762
    78
  CHECK_EQ(var, "alpha");
dvander@2762
    79
  CHECK_EQ(number, 1);
dvander@2762
    80
  CHECK_EQ(s.LineNumber(), 3);
dvander@2762
    81
  s.GetNextComments(&comments);
dvander@2762
    82
  CHECK_EQ(comments.size(), 1);
dvander@2762
    83
  CHECK_EQ(comments[0].as_string(), " // this sets alpha\n");
dvander@2762
    84
  comments.resize(0);
dvander@2762
    85
dvander@2762
    86
  s.Consume(re, &var, &number);
dvander@2762
    87
  CHECK_EQ(var, "bravo");
dvander@2762
    88
  CHECK_EQ(number, 2);
dvander@2762
    89
  s.GetNextComments(&comments);
dvander@2762
    90
  CHECK_EQ(comments.size(), 1);
dvander@2762
    91
  CHECK_EQ(comments[0].as_string(), " // bravo is set here\n");
dvander@2762
    92
  comments.resize(0);
dvander@2762
    93
dvander@2762
    94
  s.Consume(re, &var, &number);
dvander@2762
    95
  CHECK_EQ(var, "gamma");
dvander@2762
    96
  CHECK_EQ(number, 33);
dvander@2762
    97
  s.GetNextComments(&comments);
dvander@2762
    98
  CHECK_EQ(comments.size(), 1);
dvander@2762
    99
  CHECK_EQ(comments[0].as_string(), " /* and here is gamma */\n");
dvander@2762
   100
  comments.resize(0);
dvander@2762
   101
dvander@2762
   102
  s.GetComments(0, sizeof(input), &comments);
dvander@2762
   103
  CHECK_EQ(comments.size(), 3);
dvander@2762
   104
  CHECK_EQ(comments[0].as_string(), " // this sets alpha\n");
dvander@2762
   105
  CHECK_EQ(comments[1].as_string(), " // bravo is set here\n");
dvander@2762
   106
  CHECK_EQ(comments[2].as_string(), " /* and here is gamma */\n");
dvander@2762
   107
  comments.resize(0);
dvander@2762
   108
dvander@2762
   109
  s.GetComments(0, strchr(input, '/') - input, &comments);
dvander@2762
   110
  CHECK_EQ(comments.size(), 0);
dvander@2762
   111
  comments.resize(0);
dvander@2762
   112
dvander@2762
   113
  s.GetComments(strchr(input, '/') - input - 1, sizeof(input),
dvander@2762
   114
                &comments);
dvander@2762
   115
  CHECK_EQ(comments.size(), 3);
dvander@2762
   116
  CHECK_EQ(comments[0].as_string(), " // this sets alpha\n");
dvander@2762
   117
  CHECK_EQ(comments[1].as_string(), " // bravo is set here\n");
dvander@2762
   118
  CHECK_EQ(comments[2].as_string(), " /* and here is gamma */\n");
dvander@2762
   119
  comments.resize(0);
dvander@2762
   120
dvander@2762
   121
  s.GetComments(strchr(input, '/') - input - 1,
dvander@2762
   122
                strchr(input + 1, '\n') - input + 1, &comments);
dvander@2762
   123
  CHECK_EQ(comments.size(), 1);
dvander@2762
   124
  CHECK_EQ(comments[0].as_string(), " // this sets alpha\n");
dvander@2762
   125
  comments.resize(0);
dvander@2762
   126
}
dvander@2762
   127
dvander@2762
   128
static void TestBigComment() {
dvander@2762
   129
  string input;
dvander@2762
   130
  for (int i = 0; i < 1024; ++i) {
dvander@2762
   131
    char buf[1024];  // definitely big enough
dvander@2762
   132
    sprintf(buf, "    # Comment %d\n", i);
dvander@2762
   133
    input += buf;
dvander@2762
   134
  }
dvander@2762
   135
  input += "name = value;\n";
dvander@2762
   136
dvander@2762
   137
  Scanner s(input.c_str());
dvander@2762
   138
  s.SetSkipExpression("\\s+|#.*\n");
dvander@2762
   139
dvander@2762
   140
  string name;
dvander@2762
   141
  string value;
dvander@2762
   142
  s.Consume("(\\w+) = (\\w+);", &name, &value);
dvander@2762
   143
  CHECK_EQ(name, "name");
dvander@2762
   144
  CHECK_EQ(value, "value");
dvander@2762
   145
}
dvander@2762
   146
dvander@2762
   147
// TODO: also test scanner and big-comment in a thread with a
dvander@2762
   148
//       small stack size
dvander@2762
   149
dvander@2762
   150
int main(int argc, char** argv) {
dvander@2762
   151
  TestScanner();
dvander@2762
   152
  TestBigComment();
dvander@2762
   153
dvander@2762
   154
  // Done
dvander@2762
   155
  printf("OK\n");
dvander@2762
   156
dvander@2762
   157
  return 0;
dvander@2762
   158
}