#include "fs-compat.hpp" #include "options.hpp" #include "search.hpp" #include #include #include #include #include SCENARIO("Searching 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; 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 == "πŸ“– πŸ“˜"); REQUIRE(matches.at(0).context.second == "πŸ“™ "); } } WHEN("We search for β€˜ ’ (space) 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(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 == " "); REQUIRE(matches.at(10).context.first == "πŸ“–"); REQUIRE(matches.at(10).context.second == "πŸ“˜πŸ“—πŸ“™ "); REQUIRE(matches.at(11).filepath == "test folder/😊"); REQUIRE(matches.at(11).text == " "); REQUIRE(matches.at(11).context.first == "πŸ“˜πŸ“—πŸ“™"); REQUIRE(matches.at(11).context.second == ""); } } 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. I'm stay"); REQUIRE(matches.at(0).context.first == "to "); REQUIRE(matches.at(0).context.second == "ing in"); } } } } }