#include "fs-compat.hpp" #include "options.hpp" #include "search.hpp" #include #include #include #include #include SCENARIO("Searching ZIP files works") { 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 matches; epubgrep::search::settings opts; opts.raw = true; WHEN("We search for β€˜πŸ“™+\\w?’ using extended regular expressions") { try { opts.regex = epubgrep::options::regex_kind::extended; 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πŸ“˜"); REQUIRE(matches.at(0).context.second == "πŸ“™"); } } WHEN("We search for β€˜[ \\n]’ with context = 1.") { try { opts.context = 1; opts.regex = epubgrep::options::regex_kind::perl; matches = epubgrep::search::search(zipfile, R"([ \n])", opts); } 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. 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"); REQUIRE(matches.at(10).context.first == "πŸ“–"); 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()); } } 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; 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"); REQUIRE(matches.at(0).context.first == "to "); REQUIRE(matches.at(0).context.second == "ing in"); } } } } }