// Copyright 2009 The RE2 Authors.  All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#include <string>

#include "util/test.h"
#include "util/logging.h"
#include "re2/regexp.h"

namespace re2 {

struct PrefixTest {
  const char* regexp;
  bool return_value;
  const char* prefix;
  bool foldcase;
  const char* suffix;
};

static PrefixTest tests[] = {
  // If the regexp is missing a ^, there's no required prefix.
  { "abc", false },
  { "", false },
  { "(?m)^", false },

  // If the regexp immediately goes into
  // something not a literal match, there's no required prefix.
  { "^(abc)", false },
  { "^a*",  false },

  // Otherwise, it should work.
  { "^abc$", true, "abc", false, "(?-m:$)" },
  { "^abc", true, "abc", false, "" },
  { "^(?i)abc", true, "abc", true, "" },
  { "^abcd*", true, "abc", false, "d*" },
  { "^[Aa][Bb]cd*", true, "ab", true, "cd*" },
  { "^ab[Cc]d*", true, "ab", false, "[Cc]d*" },
  { "^☺abc", true, "☺abc", false, "" },
};

TEST(RequiredPrefix, SimpleTests) {
  for (int i = 0; i < arraysize(tests); i++) {
    const PrefixTest& t = tests[i];
    for (int j = 0; j < 2; j++) {
      Regexp::ParseFlags flags = Regexp::LikePerl;
      if (j == 0)
        flags = flags | Regexp::Latin1;
      Regexp* re = Regexp::Parse(t.regexp, flags, NULL);
      ASSERT_TRUE(re != NULL) << " " << t.regexp;

      string p;
      bool f;
      Regexp* s;
      ASSERT_EQ(t.return_value, re->RequiredPrefix(&p, &f, &s))
        << " " << t.regexp << " " << (j==0 ? "latin1" : "utf")
        << " " << re->Dump();
      if (t.return_value) {
        ASSERT_EQ(p, string(t.prefix))
          << " " << t.regexp << " " << (j==0 ? "latin1" : "utf");
        ASSERT_EQ(f, t.foldcase)
          << " " << t.regexp << " " << (j==0 ? "latin1" : "utf");
        ASSERT_EQ(s->ToString(), string(t.suffix))
          << " " << t.regexp << " " << (j==0 ? "latin1" : "utf");
        s->Decref();
      }
      re->Decref();
    }
  }
}

}  // namespace re2
