Skip to content

Commit

Permalink
add initial version of wpt test runner
Browse files Browse the repository at this point in the history
  • Loading branch information
anonrig committed Jan 8, 2025
1 parent fc5b020 commit 690a14a
Showing 1 changed file with 84 additions and 0 deletions.
84 changes: 84 additions & 0 deletions tests/wpt_urlpattern_tests.cpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
#include <filesystem>
#include <iostream>

#include "gtest/gtest.h"
#include "simdjson.h"

#include "ada.h"
#include "ada/url_pattern.h"
#include "ada/parser.h"

using namespace simdjson;

constexpr std::string_view URL_PATTERN_TEST_DATA =
"wpt/urlpatterntestdata.json";

// Tests are taken from WPT
// https://github.com/web-platform-tests/wpt/blob/0c1d19546fd4873bb9f4147f0bbf868e7b4f91b7/urlpattern/resources/urlpattern-hasregexpgroups-tests.js
TEST(wpt_urlpattern_tests, has_regexp_groups) {
Expand Down Expand Up @@ -56,3 +63,80 @@ TEST(wpt_urlpattern_tests, has_regexp_groups) {

SUCCEED();
}

ada::url_pattern_init parse_pattern_field(ondemand::array& patterns) {
ada::url_pattern_init init{};
size_t pattern_size = patterns.count_elements().value_unsafe();
EXPECT_TRUE(pattern_size == 1);
for (auto pattern : patterns) {
ondemand::object object = pattern.get_object();

for (auto field : object) {
object.reset();
auto key = field.key().value();
std::string_view value;
EXPECT_FALSE(field.value().get_string(value));
if (key == "protocol") {
init.protocol = std::string(value);
} else if (key == "username") {
init.username = std::string(value);
} else if (key == "password") {
init.password = std::string(value);
} else if (key == "hostname") {
init.hostname = std::string(value);
} else if (key == "port") {
init.port = std::string(value);
} else if (key == "pathname") {
init.pathname = std::string(value);
} else if (key == "search") {
init.search = std::string(value);
} else if (key == "hash") {
init.hash = std::string(value);
}
}
}
return init;
}

TEST(wpt_urlpattern_tests, urlpattern_test_data) {
ondemand::parser parser;
ASSERT_TRUE(std::filesystem::exists(URL_PATTERN_TEST_DATA));
padded_string json = padded_string::load(URL_PATTERN_TEST_DATA);
ondemand::document doc = parser.iterate(json);
try {
for (auto element : doc.get_array()) {
if (element.type() == ondemand::json_type::string) {
std::cout << " comment: " << element.get_string() << std::endl;
continue;
}

ondemand::object main_object = element.get_object();

for (auto mainfield : main_object) {
auto key = mainfield.key().value();
auto value = mainfield.value();
auto value_type = value.type().value();

if (key == "expected_obj") {
if (value_type == ondemand::json_type::string &&
value.value() == "error") {
ondemand::array patterns;
ASSERT_FALSE(
main_object.find_field_unordered("pattern").get_array().get(
patterns));
auto init = parse_pattern_field(patterns);
std::cout << "patterns: " << patterns.raw_json().value()
<< std::endl;
ASSERT_FALSE(ada::parse_url_pattern(init));
}
}
}
}
} catch (simdjson_error& error) {
std::cerr << "JSON error: " << error.what() << " near "
<< doc.current_location() << " in " << URL_PATTERN_TEST_DATA
<< std::endl;
FAIL();
}
SUCCEED();
}

0 comments on commit 690a14a

Please sign in to comment.