/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "gtest/gtest.h"
#include "mozilla/RustRegex.h"
// This file is adapted from the test.c file in the `rure` crate, but modified
// to use gtest and the `RustRegex` wrapper.
namespace mozilla {
TEST(TestRustRegex, IsMatch)
{
RustRegex re(
"\\p{So}$");
ASSERT_TRUE(re.IsValid());
ASSERT_TRUE(re.IsMatch(
"snowman: \xE2\x98\x83"));
}
TEST(TestRustRegex, ShortestMatch)
{
RustRegex re(
"a+");
ASSERT_TRUE(re.IsValid());
Maybe<size_t> match = re.ShortestMatch(
"aaaaa");
ASSERT_TRUE(match);
EXPECT_EQ(*match, 1u);
}
TEST(TestRustRegex, Find)
{
RustRegex re(
"\\p{So}$");
ASSERT_TRUE(re.IsValid());
auto match = re.Find(
"snowman: \xE2\x98\x83");
ASSERT_TRUE(match);
EXPECT_EQ(match->start, 9u);
EXPECT_EQ(match->end, 12u);
}
TEST(TestRustRegex, Captures)
{
RustRegex re(
".(.*(?P\\p{So}))$");
ASSERT_TRUE(re);
auto captures = re.FindCaptures(
"snowman: \xE2\x98\x83");
ASSERT_TRUE(captures);
EXPECT_EQ(captures.Length(), 3u);
EXPECT_EQ(re.CaptureNameIndex(
"snowman"), 2);
auto match = captures[2];
ASSERT_TRUE(match);
EXPECT_EQ(match->start, 9u);
EXPECT_EQ(match->end, 12u);
}
TEST(TestRustRegex, Iter)
{
RustRegex re(
"\\w+(\\w)");
ASSERT_TRUE(re);
auto it = re.IterMatches(
"abc xyz");
ASSERT_TRUE(it);
auto match = it.Next();
ASSERT_TRUE(match);
EXPECT_EQ(match->start, 0u);
EXPECT_EQ(match->end, 3u);
auto captures = it.NextCaptures();
ASSERT_TRUE(captures);
auto capture = captures[1];
ASSERT_TRUE(capture);
EXPECT_EQ(capture->start, 6u);
EXPECT_EQ(capture->end, 7u);
}
TEST(TestRustRegex, IterCaptureNames)
{
RustRegex re(
"(?P\\d{4})-(?P\\d{2})-(?P\\d{2})");
ASSERT_TRUE(re);
auto it = re.IterCaptureNames();
Maybe<
const char*> result = it.Next();
ASSERT_TRUE(result.isSome());
EXPECT_STREQ(*result,
"");
result = it.Next();
ASSERT_TRUE(result.isSome());
EXPECT_STREQ(*result,
"year");
result = it.Next();
ASSERT_TRUE(result.isSome());
EXPECT_STREQ(*result,
"month");
result = it.Next();
ASSERT_TRUE(result.isSome());
EXPECT_STREQ(*result,
"day");
result = it.Next();
ASSERT_TRUE(result.isNothing());
}
/*
* This tests whether we can set the flags correctly. In this case, we disable
* all flags, which includes disabling Unicode mode. When we disable Unicode
* mode, we can match arbitrary possibly invalid UTF-8 bytes, such as \xFF.
* (When Unicode mode is enabled, \xFF won't match .)
*/
TEST(TestRustRegex, Flags)
{
{
RustRegex re(
".");
ASSERT_TRUE(re);
ASSERT_FALSE(re.IsMatch(
"\xFF"));
}
{
RustRegex re(
".", RustRegexOptions().Unicode(
false));
ASSERT_TRUE(re);
ASSERT_TRUE(re.IsMatch(
"\xFF"));
}
}
TEST(TestRustRegex, CompileErrorSizeLimit)
{
RustRegex re(
"\\w{100}", RustRegexOptions().SizeLimit(0));
EXPECT_FALSE(re);
}
TEST(TestRustRegex, SetMatches)
{
RustRegexSet set(nsTArray<std::string_view>{
"foo",
"barfoo",
"\\w+",
"\\d+",
"foobar",
"bar"});
ASSERT_TRUE(set);
EXPECT_EQ(set.Length(), 6u);
EXPECT_TRUE(set.IsMatch(
"foobar"));
EXPECT_FALSE(set.IsMatch(
""));
auto matches = set.Matches(
"foobar");
EXPECT_TRUE(matches.matchedAny);
EXPECT_EQ(matches.matches.Length(), 6u);
nsTArray<
bool> expectedMatches{
true,
false,
true,
false,
true,
true};
EXPECT_EQ(matches.matches, expectedMatches);
}
TEST(TestRustRegex, SetMatchStart)
{
RustRegexSet re(nsTArray<std::string_view>{
"foo",
"bar",
"fooo"});
EXPECT_TRUE(re);
EXPECT_EQ(re.Length(), 3u);
EXPECT_FALSE(re.IsMatch(
"foobiasdr", 2));
{
auto matches = re.Matches(
"fooobar");
EXPECT_TRUE(matches.matchedAny);
nsTArray<
bool> expectedMatches{
true,
true,
true};
EXPECT_EQ(matches.matches, expectedMatches);
}
{
auto matches = re.Matches(
"fooobar", 1);
EXPECT_TRUE(matches.matchedAny);
nsTArray<
bool> expectedMatches{
false,
true,
false};
EXPECT_EQ(matches.matches, expectedMatches);
}
}
TEST(TestRustRegex, RegexSetOptions)
{
RustRegexSet re(nsTArray<std::string_view>{
"\\w{100}"},
RustRegexOptions().SizeLimit(0));
EXPECT_FALSE(re);
}
}
// namespace mozilla