Author: Mason Wright
Email:
[email protected]
Date: Sun, 29 Jun 2025 16:50:58 -0600
tests/html_parser.cc
e188783659b9bc3b9993a647e93ed110e7f41db6
Fixed partSelectorParts matching on spaces
Clone
M
.gitignore
M
Makefile
A
config
-
include/catch_amalgamated.cpp
-
include/catch_amalgamated.hpp
M
include/grim.h
-
include/parser.h
-
index.html
-
main.cc
-
src/adapter.cc
-
src/events.cc
M
src/grim.cc
-
src/parser.cc
-
style.css
M
tests/css_selector.cc
-
tests/html_parser.cc
Commits
b966b2a517365074e5c381dbdea05b3221dc0198
e840f1eeb0ae26af69e1ae146ea9938e28e9f1af
e4e05418a640eaed08cd1ec7cd8644eb1dbcca50
4e01ba8ad2c3361fa4be3d896288020948b58b5e
aae562ac1350480e4889aabb35899f776c5b59e9
6c3ae0e31eb0893f20e3872117f92cc6b9a942af
350e7d88bb2feb9db00c6e032cc6623f215b7adf
95e6c70d23e99ffcf70e5bbe12503496e5d8f232
e188783659b9bc3b9993a647e93ed110e7f41db6
5e4c38ff3c212cdd9881427ef3f8c2706539a190
e50ea9e1356a74af18fdd171337ef9dc931e1f4e
8f2e83556d12aaebe8e8597ea6923804b0eb7a43
1627c585128af263181053ab2cf1a4cdcd14ee21
def3513f75b325464ad88a33c741c4ca80572b77
a21501590980a905fa9b902897d700a42a08b7f0
56074a6bfe4498d092f3a227297c8c20e2bb962c
d9cf1485b7ae0614130494f0e73237921323b9a1
80f04b134ae32ad8a9d526007b33dd02f6600f05
23d6c65f9368d3c622a55a3068a6b2f1efa0c8d4
09c195df02536b6a796bd648fce9669397b96109
f2b5c8202fbc904e2ed78260e3fdbd55164799d2
4bfba076120f389994fc46a98e8b7a2622314400
e36ac5417e10ee9b9f94f340e1ccf28afc5705ea
d00dc89a86dd7e2fcfd4618bc3a1c8cfba9e3c3d
d9eef16adaf292f3748db5fb5aa98463de10d712
18ff2ec1bfc1cf9fcd17c1acb05c3b41f8f0ed83
9e7fd2980d723437ea621b78d395fa72ca3f4922
Diff
#include
#include "../include/grim.h" #include "../include/parser.h" #include
#include
void checkNode(Node* node, std::string tagName, unsigned long children, std::string id, std::vector
classes, std::unordered_map
attributes, std::string note = "") { INFO("========================="); INFO("TAG: "+tagName); INFO("NOTE: "+note+"\n"); INFO("HTML:\n"+node->print()); REQUIRE(node->getTagName() == tagName); REQUIRE(node->children.size() == children); REQUIRE(node->getId() == id); size_t i = 0; for (auto c : node->classList.values()) { REQUIRE(c == classes[i]); i++; } for (auto pair : attributes) { REQUIRE(node->getAttribute(pair.first) == pair.second); } } TEST_CASE( "parseStream can parse various types of HTML strings", "[html]" ) { SECTION("Parses a simple HTML document") { std::string html = "" "" "" "
This is a simple test
" "
" "" "" "
This is some text for a simple test
" "" ""; std::stringstream ss(html); std::unique_ptr
document = parseStream(ss); BENCHMARK("Simple HTML Document") { return parseStream(ss); }; // Ensure the only child of root is html Node* current = document->children[0].get(); checkNode(current, "html", 2, "", {}, {{}}); current = current->children[0].get(); checkNode(current, "head", 2, "", {}, {{}}); current = current->children[0].get(); checkNode(current, "title", 1, "", {}, {{}}); current = current->children[0].get(); checkNode(current, "text", 0, "", {}, {{"innerText","This is a simple test"}}, "First innerText check"); current = current->parent->parent->children[1].get(); checkNode(current, "link", 0, "", {}, {{"rel","stylesheet"}, {"href","/style.css"}} , "Check attribute parsing with different quote types. Also check self closing tags"); current = current->parent->parent->children[1].get(); checkNode(current, "body", 1, "", {}, {{}}); current = current->children[0].get(); checkNode(current, "p", 1, "paragraph", {"class1", "class2"}, {{}}, "Checks for id and class parsing"); current = current->children[0].get(); checkNode(current, "text", 0, "", {}, {{"innerText","This is some text for a simple test"}}, "Second innerText check"); } SECTION("Inline comment") { std::string html = "
" "" "
"; std::stringstream ss(html); std::unique_ptr
document = parseStream(ss); BENCHMARK("Inline comment") { return parseStream(ss); }; // Ensure the only child of root is html Node* current = document->children[0].get(); checkNode(current, "div", 0, "", {}, {{}}); } SECTION("Multi line comment") { std::string html = "
" "" "
"; std::stringstream ss(html); std::unique_ptr
document = parseStream(ss); BENCHMARK("Multiline comment") { return parseStream(ss); }; // Ensure the only child of root is html Node* current = document->children[0].get(); checkNode(current, "div", 0, "", {}, {{}}); } SECTION("Multi line comment with html") { std::string html = "
" "" "
"; std::stringstream ss(html); std::unique_ptr
document = parseStream(ss); BENCHMARK("Multiline comment with HTML") { return parseStream(ss); }; // Ensure the only child of root is html Node* current = document->children[0].get(); checkNode(current, "div", 0, "", {}, {{}}); } SECTION("Style tag parsing (with HTML in the content prop)") { std::string html = "" "
test
"; std::stringstream ss(html); std::unique_ptr
document = parseStream(ss); BENCHMARK("Style tag parsing (with HTML in the content prop)") { return parseStream(ss); }; // Ensure the only child of root is html Node* current = document->children[0].get(); checkNode(current, "style", 1, "", {}, {{}}); current = current->children[0].get(); checkNode(current, "text", 0, "", {}, {{"innerText", "body > h1 {" "margin-left: calc(100% / 50px);" "background: url(https://example.com/image.png);" "content: \"
hi
\";" "}"}}); current = document->children[1].get(); checkNode(current, "h1", 1, "", {}, {{}}); current = current->children[0].get(); checkNode(current, "text", 0, "", {}, {{"innerText", "test"}}); } SECTION("Script tag prematurly closing a pre tag") { std::string html = "
" "" "
"; std::stringstream ss(html); std::unique_ptr
document = parseStream(ss); BENCHMARK("Script tag prematurly closing a pre tag") { return parseStream(ss); }; // Ensure the only child of root is html Node* current = document->children[0].get(); checkNode(current, "pre", 1, "", {}, {{}}); current = current->children[0].get(); checkNode(current, "script", 1, "", {}, {{}}); current = current->children[0].get(); checkNode(current, "text", 0, "", {}, {{"innerText", "console.log(\"\");"}}); } SECTION("Textarea with script tag inside") { std::string html = "
" "" "
"; std::stringstream ss(html); std::unique_ptr
document = parseStream(ss); BENCHMARK("Textarea with script tag inside") { return parseStream(ss); }; // Ensure the only child of root is html Node* current = document->children[0].get(); checkNode(current, "textarea", 1, "", {}, {{}}); current = current->children[0].get(); checkNode(current, "text", 0, "", {}, {{"innerText",""}}); } }