epubgrep/tests/test_search_zip.cpp

138 lines
5.1 KiB
C++
Raw Normal View History

2021-05-24 20:12:30 +02:00
#include "fs-compat.hpp"
#include "options.hpp"
2021-05-24 20:12:30 +02:00
#include "search.hpp"
#include <catch.hpp>
#include <clocale>
#include <exception>
#include <string>
#include <vector>
2021-05-29 23:35:39 +02:00
SCENARIO("Searching ZIP files works")
2021-05-24 20:12:30 +02:00
{
GIVEN("Our test zip file")
{
fs::path zipfile{"test.zip"};
std::setlocale(LC_CTYPE, ""); // Needed for utf-8 support in libarchive.
bool exception{false};
REQUIRE(fs::exists(zipfile));
SECTION("search() doesn't fail and returns the right lines")
{
std::vector<epubgrep::search::match> matches;
epubgrep::search::settings opts;
opts.raw = true;
2021-05-24 20:12:30 +02:00
WHEN("We search for ‘📙+\\w? using extended regular expressions")
{
try
{
opts.regex = epubgrep::options::regex_kind::extended;
2021-05-24 20:12:30 +02:00
matches = epubgrep::search::search(zipfile, "📙+\\w?", opts);
}
catch (const std::exception &)
{
exception = true;
}
THEN("No exception is thrown")
AND_THEN("It returns the match correctly")
{
REQUIRE_FALSE(exception);
REQUIRE(matches.at(0).filepath == "test folder/😊");
REQUIRE(matches.at(0).text == "📙");
}
}
WHEN("We search for ‘📗’ with context = 1")
{
try
{
opts.context = 1;
matches = epubgrep::search::search(zipfile, "📗", opts);
}
catch (const std::exception &)
{
exception = true;
}
THEN("No exception is thrown")
AND_THEN("It returns the match correctly")
{
REQUIRE_FALSE(exception);
REQUIRE(matches.at(0).filepath == "test folder/😊");
REQUIRE(matches.at(0).text == "📗");
REQUIRE(matches.at(0).context.first == "📖\n\n📘");
2021-05-30 13:48:11 +02:00
REQUIRE(matches.at(0).context.second == "📙");
2021-05-24 20:12:30 +02:00
}
}
WHEN("We search for [ \\n] with context = 1.")
2021-05-24 20:12:30 +02:00
{
try
{
opts.context = 1;
opts.regex = epubgrep::options::regex_kind::perl;
matches = epubgrep::search::search(zipfile, R"([ \n])",
opts);
2021-05-24 20:12:30 +02:00
}
catch (const std::exception &)
{
exception = true;
}
THEN("No exception is thrown")
AND_THEN("It returns the match correctly")
{
// I looked at this a week or so after I've written it, and
// I have come to the realization that this is a tiny bit
// more complicated than strictly required. 😄
// TODO: Rewrite test.zip and tests to be better
// understandable.
2021-05-24 20:12:30 +02:00
REQUIRE_FALSE(exception);
REQUIRE(matches.at(1).filepath == "test folder/test file");
REQUIRE(matches.at(1).text == " ");
REQUIRE(matches.at(1).context.first == "don't");
REQUIRE(matches.at(1).context.second == "want to");
REQUIRE(matches.at(10).filepath == "test folder/😊");
REQUIRE(matches.at(10).text == "\n");
2021-05-24 20:12:30 +02:00
REQUIRE(matches.at(10).context.first == "📖");
2021-05-30 13:48:11 +02:00
REQUIRE(matches.at(10).context.second == "\n📘📗📙");
REQUIRE(matches.at(12).filepath == "test folder/😊");
REQUIRE(matches.at(12).text == "\n");
REQUIRE(matches.at(12).context.first == "📘📗📙");
REQUIRE(matches.at(12).context.second.empty());
2021-05-24 20:12:30 +02:00
}
}
WHEN(R"(We search for work\s[\w]+\.\W[\w']+\Wstay )"
R"(using Perl regular expressions. context = 1.)")
{
try
{
opts.context = 1;
opts.regex = epubgrep::options::regex_kind::extended;
2021-05-24 20:12:30 +02:00
matches = epubgrep::search::search(
zipfile, R"(work\s[\w]+\.\W[\w']+\Wstay)", opts);
}
catch (const std::exception &)
{
exception = true;
}
THEN("No exception is thrown")
AND_THEN("It returns the match correctly")
{
REQUIRE_FALSE(exception);
REQUIRE(matches.at(0).filepath == "test folder/test file");
REQUIRE(matches.at(0).text == "work today.\nI'm stay");
2021-05-24 20:12:30 +02:00
REQUIRE(matches.at(0).context.first == "to ");
REQUIRE(matches.at(0).context.second == "ing in");
}
}
}
}
}