From f30abe29f0072ce2fa9acbef1c8ab998f5dc7723 Mon Sep 17 00:00:00 2001 From: Yagiz Nizipli Date: Fri, 24 Jan 2025 16:01:25 -0500 Subject: [PATCH] update url_pattern to pass more wpt on node.js --- include/ada/implementation.h | 2 -- include/ada/url_pattern-inl.h | 5 ----- src/url_pattern_regex.cpp | 3 ++- tests/wpt_urlpattern_tests.cpp | 26 ++++++++++++++++++++++++++ 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/include/ada/implementation.h b/include/ada/implementation.h index 33e166715..e79670031 100644 --- a/include/ada/implementation.h +++ b/include/ada/implementation.h @@ -53,8 +53,6 @@ bool can_parse(std::string_view input, * @param input valid UTF-8 string or URLPatternInit struct * @param base_url an optional valid UTF-8 string * @param options an optional url_pattern_options struct - * @param provider an optional regex provider. if not provided, it will - * use ada::url_pattern_regex::std_regex_provider * @return url_pattern instance */ template ::create_component_match_result( auto result = url_pattern_component_result{.input = std::string(input), .groups = {}}; - // If input is empty, then groups will always be empty. - if (input.empty()) { - return result; - } - // Optimization: Let's reserve the size. result.groups.reserve(exec_result.size()); diff --git a/src/url_pattern_regex.cpp b/src/url_pattern_regex.cpp index ec62edf2c..59cac71b9 100644 --- a/src/url_pattern_regex.cpp +++ b/src/url_pattern_regex.cpp @@ -31,7 +31,8 @@ std_regex_provider::regex_search(std::string_view input, return std::nullopt; } std::vector> matches; - if (match_result.empty()) { + // If input is empty, let's assume the result will be empty as well. + if (input.empty() || match_result.empty()) { return matches; } matches.reserve(match_result.size()); diff --git a/tests/wpt_urlpattern_tests.cpp b/tests/wpt_urlpattern_tests.cpp index 5f58434ce..93b694aee 100644 --- a/tests/wpt_urlpattern_tests.cpp +++ b/tests/wpt_urlpattern_tests.cpp @@ -14,6 +14,32 @@ using namespace simdjson; constexpr std::string_view URL_PATTERN_TEST_DATA = "wpt/urlpatterntestdata.json"; +TEST(wpt_urlpattern_tests, test_regex_difference) { + // { + // "pattern": [{ "pathname": "/foo/bar" }], + // "inputs": [{ "pathname": "/foo/bar" }], + // "expected_match": { + // "pathname": { "input": "/foo/bar", "groups": {} } + // } + // } + auto init = ada::url_pattern_init{}; + init.pathname = "/foo/bar"; + auto u = + ada::parse_url_pattern(init); + ASSERT_TRUE(u); + auto match = u->exec(init, nullptr); + ASSERT_TRUE(match); + ASSERT_TRUE(match->has_value()); + + std::unordered_map> empty_object{}; + + ASSERT_EQ(match->value().protocol.input, ""); + ASSERT_EQ(match->value().protocol.groups, empty_object); + ASSERT_EQ(match->value().pathname.input, "/foo/bar"); + ASSERT_EQ(match->value().pathname.groups, empty_object); + SUCCEED(); +} + TEST(wpt_urlpattern_tests, parser_tokenize_basic_tests) { auto tokenize_result = tokenize("*", ada::url_pattern_helpers::token_policy::STRICT);