srctree

Robin Linden parent 150d404d 6e4cc192
etest: Add support for hard test requirements

These stop the test if failed. Nice to use for e.g. array size checksbefore indexing into them.

inlinesplit
css/parser_test.cpp added: 53, removed: 38, total 15
@@ -4,11 +4,12 @@
 
using namespace std::literals;
using etest::expect;
using etest::require;
 
int main() {
etest::test("parser: simple rule", [] {
auto rules = css::parse("body { width: 50px; }"sv);
expect(rules.size() == 1);
require(rules.size() == 1);
 
auto body = rules[0];
expect(body.selectors == std::vector{"body"s});
@@ -18,7 +19,7 @@ int main() {
 
etest::test("parser: multiple rules", [] {
auto rules = css::parse("body { width: 50px; }\np { font-size: 8em; }"sv);
expect(rules.size() == 2);
require(rules.size() == 2);
 
auto body = rules[0];
expect(body.selectors == std::vector{"body"s});
@@ -33,7 +34,7 @@ int main() {
 
etest::test("parser: multiple selectors", [] {
auto rules = css::parse("body, p { width: 50px; }"sv);
expect(rules.size() == 1);
require(rules.size() == 1);
 
auto body = rules[0];
expect(body.selectors == std::vector{"body"s, "p"s});
@@ -43,7 +44,7 @@ int main() {
 
etest::test("parser: multiple declarations", [] {
auto rules = css::parse("body { width: 50px; height: 300px; }"sv);
expect(rules.size() == 1);
require(rules.size() == 1);
 
auto body = rules[0];
expect(body.selectors == std::vector{"body"s});
@@ -54,7 +55,7 @@ int main() {
 
etest::test("parser: class", [] {
auto rules = css::parse(".cls { width: 50px; }"sv);
expect(rules.size() == 1);
require(rules.size() == 1);
 
auto body = rules[0];
expect(body.selectors == std::vector{".cls"s});
@@ -64,7 +65,7 @@ int main() {
 
etest::test("parser: id", [] {
auto rules = css::parse("#cls { width: 50px; }"sv);
expect(rules.size() == 1);
require(rules.size() == 1);
 
auto body = rules[0];
expect(body.selectors == std::vector{"#cls"s});
@@ -74,7 +75,7 @@ int main() {
 
etest::test("parser: empty rule", [] {
auto rules = css::parse("body {}"sv);
expect(rules.size() == 1);
require(rules.size() == 1);
 
auto body = rules[0];
expect(body.selectors == std::vector{"body"s});
 
etest/etest.cpp added: 53, removed: 38, total 15
@@ -1,6 +1,7 @@
#include "etest/etest.h"
 
#include <algorithm>
#include <exception>
#include <iomanip>
#include <iostream>
#include <vector>
@@ -20,6 +21,8 @@ std::vector<Test> &registry() {
return test_registry;
}
 
struct test_failure : public std::exception {};
 
} // namespace
 
int run_all_tests() noexcept {
@@ -54,4 +57,8 @@ void expect(bool b) noexcept {
if (!b) { ++assertion_failures; }
}
 
void require(bool b) {
if (!b) { throw test_failure{}; }
}
 
} // namespace etest
 
etest/etest.h added: 53, removed: 38, total 15
@@ -8,8 +8,13 @@ namespace etest {
 
int run_all_tests() noexcept;
int test(std::string_view name, std::function<void()> body) noexcept;
 
// Weak test requirement. Allows the test to continue even if the check fails.
void expect(bool) noexcept;
 
// Hard test requirement. Stops the test (using an exception) if the check fails.
void require(bool);
 
} // namespace etest
 
#endif
 
html/test_parser.cpp added: 53, removed: 38, total 15
@@ -4,11 +4,12 @@
 
using namespace std::literals;
using etest::expect;
using etest::require;
 
int main() {
etest::test("doctype", [] {
auto nodes = html::parse("<!doctype html>"sv);
expect(nodes.size() == 1);
require(nodes.size() == 1);
 
auto doctype = nodes[0];
expect(doctype.children.size() == 0);
@@ -17,7 +18,7 @@ int main() {
 
etest::test("weirdly capitalized doctype", [] {
auto nodes = html::parse("<!docTYpe html>"sv);
expect(nodes.size() == 1);
require(nodes.size() == 1);
 
auto doctype = nodes[0];
expect(doctype.children.size() == 0);
@@ -26,7 +27,7 @@ int main() {
 
etest::test("single element", [] {
auto nodes = html::parse("<html></html>"sv);
expect(nodes.size() == 1);
require(nodes.size() == 1);
 
auto html = nodes[0];
expect(html.children.size() == 0);
@@ -36,7 +37,7 @@ int main() {
 
etest::test("self-closing single element", [] {
auto nodes = html::parse("<br>"sv);
expect(nodes.size() == 1);
require(nodes.size() == 1);
 
auto br = nodes[0];
expect(br.children.size() == 0);
@@ -46,7 +47,7 @@ int main() {
 
etest::test("self-closing single element with slash", [] {
auto nodes = html::parse("<img/>"sv);
expect(nodes.size() == 1);
require(nodes.size() == 1);
 
auto img = nodes[0];
expect(img.children.size() == 0);
@@ -56,7 +57,7 @@ int main() {
 
etest::test("multiple elements", [] {
auto nodes = html::parse("<span></span><div></div>"sv);
expect(nodes.size() == 2);
require(nodes.size() == 2);
 
auto span = nodes[0];
expect(span.children.size() == 0);
@@ -71,10 +72,10 @@ int main() {
 
etest::test("nested elements", [] {
auto nodes = html::parse("<html><body></body></html>"sv);
expect(nodes.size() == 1);
require(nodes.size() == 1);
 
auto html = nodes[0];
expect(html.children.size() == 1);
require(html.children.size() == 1);
expect(std::get<dom::Element>(html.data).name == "html"s);
expect(std::get<dom::Element>(html.data).attributes.size() == 0);
 
@@ -85,7 +86,7 @@ int main() {
 
etest::test("single-quoted attribute", [] {
auto nodes = html::parse("<meta charset='utf-8'/>"sv);
expect(nodes.size() == 1);
require(nodes.size() == 1);
 
auto meta = nodes[0];
expect(meta.children.size() == 0);
@@ -98,7 +99,7 @@ int main() {
 
etest::test("double-quoted attribute", [] {
auto nodes = html::parse("<meta charset=\"utf-8\"/>"sv);
expect(nodes.size() == 1);
require(nodes.size() == 1);
 
auto meta = nodes[0];
expect(meta.children.size() == 0);
@@ -111,7 +112,7 @@ int main() {
 
etest::test("multiple attributes", [] {
auto nodes = html::parse("<meta name=\"viewport\" content=\"width=100em, initial-scale=1\"/>"sv);
expect(nodes.size() == 1);
require(nodes.size() == 1);
 
auto meta = nodes[0];
expect(meta.children.size() == 0);
@@ -125,10 +126,10 @@ int main() {
 
etest::test("multiple nodes with attributes", [] {
auto nodes = html::parse("<html bonus='hello'><body style='fancy'></body></html>"sv);
expect(nodes.size() == 1);
require(nodes.size() == 1);
 
auto html = nodes[0];
expect(html.children.size() == 1);
require(html.children.size() == 1);
auto html_data = std::get<dom::Element>(html.data);
expect(html_data.name == "html"s);
expect(html_data.attributes.size() == 1);
@@ -143,10 +144,10 @@ int main() {
 
etest::test("text node", [] {
auto nodes = html::parse("<html>fantastic, the future is now</html>"sv);
expect(nodes.size() == 1);
require(nodes.size() == 1);
 
auto html = nodes[0];
expect(html.children.size() == 1);
require(html.children.size() == 1);
expect(std::get<dom::Element>(html.data).name == "html"s);
expect(std::get<dom::Element>(html.data).attributes.size() == 0);
 
 
style/style_test.cpp added: 53, removed: 38, total 15
@@ -5,6 +5,7 @@
 
using namespace std::literals;
using etest::expect;
using etest::require;
 
int main() {
etest::test("is_match: simple names", [] {
@@ -27,14 +28,14 @@ int main() {
 
{
auto span_rules = style::matching_rules(dom::Element{"span"}, stylesheet);
expect(span_rules.size() == 1);
expect(span_rules.at(0) == std::pair{"width"s, "80px"s});
require(span_rules.size() == 1);
expect(span_rules[0] == std::pair{"width"s, "80px"s});
}
 
{
auto p_rules = style::matching_rules(dom::Element{"p"}, stylesheet);
expect(p_rules.size() == 1);
expect(p_rules.at(0) == std::pair{"width"s, "80px"s});
require(p_rules.size() == 1);
expect(p_rules[0] == std::pair{"width"s, "80px"s});
}
 
stylesheet.push_back(css::Rule{
@@ -48,21 +49,21 @@ int main() {
 
{
auto span_rules = style::matching_rules(dom::Element{"span"}, stylesheet);
expect(span_rules.size() == 2);
expect(span_rules.at(0) == std::pair{"width"s, "80px"s});
expect(span_rules.at(1) == std::pair{"height"s, "auto"s});
require(span_rules.size() == 2);
expect(span_rules[0] == std::pair{"width"s, "80px"s});
expect(span_rules[1] == std::pair{"height"s, "auto"s});
}
 
{
auto p_rules = style::matching_rules(dom::Element{"p"}, stylesheet);
expect(p_rules.size() == 1);
expect(p_rules.at(0) == std::pair{"width"s, "80px"s});
require(p_rules.size() == 1);
expect(p_rules[0] == std::pair{"width"s, "80px"s});
}
 
{
auto hr_rules = style::matching_rules(dom::Element{"hr"}, stylesheet);
expect(hr_rules.size() == 1);
expect(hr_rules.at(0) == std::pair{"height"s, "auto"s});
require(hr_rules.size() == 1);
expect(hr_rules[0] == std::pair{"height"s, "auto"s});
}
});