// Copyright 2010 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 <stddef.h>
#include <vector>

#include "util/test.h"
#include "re2/re2.h"
#include "re2/set.h"

namespace re2 {

TEST(Set, Unanchored) {
  RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);

  CHECK_EQ(s.Add("foo", NULL), 0);
  CHECK_EQ(s.Add("(", NULL), -1);
  CHECK_EQ(s.Add("bar", NULL), 1);
  CHECK_EQ(s.Compile(), true);

  CHECK_EQ(s.Match("foobar", NULL), true);
  CHECK_EQ(s.Match("fooba", NULL), true);
  CHECK_EQ(s.Match("oobar", NULL), true);

  std::vector<int> v;
  CHECK_EQ(s.Match("foobar", &v), true);
  CHECK_EQ(v.size(), 2);
  CHECK_EQ(v[0], 0);
  CHECK_EQ(v[1], 1);

  CHECK_EQ(s.Match("fooba", &v), true);
  CHECK_EQ(v.size(), 1);
  CHECK_EQ(v[0], 0);

  CHECK_EQ(s.Match("oobar", &v), true);
  CHECK_EQ(v.size(), 1);
  CHECK_EQ(v[0], 1);
}

TEST(Set, UnanchoredFactored) {
  RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);

  CHECK_EQ(s.Add("foo", NULL), 0);
  CHECK_EQ(s.Add("(", NULL), -1);
  CHECK_EQ(s.Add("foobar", NULL), 1);
  CHECK_EQ(s.Compile(), true);

  CHECK_EQ(s.Match("foobar", NULL), true);
  CHECK_EQ(s.Match("obarfoobaroo", NULL), true);
  CHECK_EQ(s.Match("fooba", NULL), true);
  CHECK_EQ(s.Match("oobar", NULL), false);

  std::vector<int> v;
  CHECK_EQ(s.Match("foobar", &v), true);
  CHECK_EQ(v.size(), 2);
  CHECK_EQ(v[0], 0);
  CHECK_EQ(v[1], 1);

  CHECK_EQ(s.Match("obarfoobaroo", &v), true);
  CHECK_EQ(v.size(), 2);
  CHECK_EQ(v[0], 0);
  CHECK_EQ(v[1], 1);

  CHECK_EQ(s.Match("fooba", &v), true);
  CHECK_EQ(v.size(), 1);
  CHECK_EQ(v[0], 0);

  CHECK_EQ(s.Match("oobar", &v), false);
  CHECK_EQ(v.size(), 0);
}

TEST(Set, UnanchoredDollar) {
  RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);

  CHECK_EQ(s.Add("foo$", NULL), 0);
  CHECK_EQ(s.Compile(), true);

  CHECK_EQ(s.Match("foo", NULL), true);

  std::vector<int> v;
  CHECK_EQ(s.Match("foo", &v), true);
  CHECK_EQ(v.size(), 1);
  CHECK_EQ(v[0], 0);
}

TEST(Set, Anchored) {
  RE2::Set s(RE2::DefaultOptions, RE2::ANCHOR_BOTH);

  CHECK_EQ(s.Add("foo", NULL), 0);
  CHECK_EQ(s.Add("(", NULL), -1);
  CHECK_EQ(s.Add("bar", NULL), 1);
  CHECK_EQ(s.Compile(), true);

  CHECK_EQ(s.Match("foobar", NULL), false);
  CHECK_EQ(s.Match("fooba", NULL), false);
  CHECK_EQ(s.Match("oobar", NULL), false);
  CHECK_EQ(s.Match("foo", NULL), true);
  CHECK_EQ(s.Match("bar", NULL), true);

  std::vector<int> v;
  CHECK_EQ(s.Match("foobar", &v), false);
  CHECK_EQ(v.size(), 0);

  CHECK_EQ(s.Match("fooba", &v), false);
  CHECK_EQ(v.size(), 0);

  CHECK_EQ(s.Match("oobar", &v), false);
  CHECK_EQ(v.size(), 0);

  CHECK_EQ(s.Match("foo", &v), true);
  CHECK_EQ(v.size(), 1);
  CHECK_EQ(v[0], 0);

  CHECK_EQ(s.Match("bar", &v), true);
  CHECK_EQ(v.size(), 1);
  CHECK_EQ(v[0], 1);
}

TEST(Set, EmptyUnanchored) {
  RE2::Set s(RE2::DefaultOptions, RE2::UNANCHORED);

  CHECK_EQ(s.Compile(), true);

  CHECK_EQ(s.Match("", NULL), false);
  CHECK_EQ(s.Match("foobar", NULL), false);

  std::vector<int> v;
  CHECK_EQ(s.Match("", &v), false);
  CHECK_EQ(v.size(), 0);

  CHECK_EQ(s.Match("foobar", &v), false);
  CHECK_EQ(v.size(), 0);
}

TEST(Set, EmptyAnchored) {
  RE2::Set s(RE2::DefaultOptions, RE2::ANCHOR_BOTH);

  CHECK_EQ(s.Compile(), true);

  CHECK_EQ(s.Match("", NULL), false);
  CHECK_EQ(s.Match("foobar", NULL), false);

  std::vector<int> v;
  CHECK_EQ(s.Match("", &v), false);
  CHECK_EQ(v.size(), 0);

  CHECK_EQ(s.Match("foobar", &v), false);
  CHECK_EQ(v.size(), 0);
}

TEST(Set, Prefix) {
  RE2::Set s(RE2::DefaultOptions, RE2::ANCHOR_BOTH);

  CHECK_EQ(s.Add("/prefix/\\d*", NULL), 0);
  CHECK_EQ(s.Compile(), true);

  CHECK_EQ(s.Match("/prefix", NULL), false);
  CHECK_EQ(s.Match("/prefix/", NULL), true);
  CHECK_EQ(s.Match("/prefix/42", NULL), true);

  std::vector<int> v;
  CHECK_EQ(s.Match("/prefix", &v), false);
  CHECK_EQ(v.size(), 0);

  CHECK_EQ(s.Match("/prefix/", &v), true);
  CHECK_EQ(v.size(), 1);
  CHECK_EQ(v[0], 0);

  CHECK_EQ(s.Match("/prefix/42", &v), true);
  CHECK_EQ(v.size(), 1);
  CHECK_EQ(v[0], 0);
}

}  // namespace re2
