Skip to content
This repository has been archived by the owner on May 14, 2021. It is now read-only.

Commit

Permalink
coverage: increase code evaluation
Browse files Browse the repository at this point in the history
  • Loading branch information
ayazhafiz committed Jan 2, 2019
1 parent f7ba58b commit 3d04a48
Show file tree
Hide file tree
Showing 5 changed files with 300 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/display.cpp
Expand Up @@ -132,7 +132,7 @@ CSS::ColorValue * Display::Command::getColor(const Layout::BoxPtr & box,
*/
Display::RectangleCmd::RectangleCmd(Layout::Rectangle rectangle,
CSS::ColorValue color)
: rectangle(rectangle), color(std::move(color)) {
: rectangle(rectangle), color(color) {
}

void Display::RectangleCmd::acceptRenderer(Renderer & renderer) const {
Expand Down
4 changes: 3 additions & 1 deletion src/layout.cpp
Expand Up @@ -152,7 +152,9 @@ Layout::BoxPtr Layout::Box::from(const Style::StyledNode & root,
window.height = 0;

auto rootBox = from(root);
dynamic_cast<StyledBox *>(rootBox.get())->layout(window);
if (auto sRoot = dynamic_cast<StyledBox *>(rootBox.get())) {
sRoot->layout(window);
}
return rootBox;
}

Expand Down
4 changes: 4 additions & 0 deletions tests/css.cpp
Expand Up @@ -15,6 +15,9 @@ TEST_F(CSSTest, ValueCtorDtor) {
TextValue text2(text);
UnitValue unit2(unit);
ColorValue color2(color);
auto text3 = make_value(TextValue("txt"));
auto unit3 = make_value(UnitValue(1.0, px));
auto color3 = make_value(ColorValue(0, 0, 0, 0));
}

TEST_F(CSSTest, makeValue) {
Expand Down Expand Up @@ -59,6 +62,7 @@ TEST_F(CSSTest, SelectorCtorDtor) {

TEST_F(CSSTest, DeclarationCtorDtor) {
Declaration declaration("key", make_value(TextValue("value")));
Declaration declaration2(declaration);
}

TEST_F(CSSTest, RuleCtorDtor) {
Expand Down
291 changes: 291 additions & 0 deletions tests/layout.cpp
Expand Up @@ -12,6 +12,9 @@ TEST_F(LayoutTest, BoxCtorDtor) {
AnonymousBox anonymousBox;
StyledBox styledBox(BoxDimensions(Rectangle(0, 0, 0, 0)),
Style::StyledNode(DOM::NodePtr(new DOM::TextNode(""))));
BoxPtr boxPtr1(anonymousBox.clone());
BoxPtr boxPtr2(styledBox.clone());
BoxPtr boxPtr3(boxPtr1->clone());
}

TEST_F(LayoutTest, stringToDisplayType) {
Expand Down Expand Up @@ -61,4 +64,292 @@ TEST_F(LayoutTest, BoxDimensions) {
ASSERT_EQ(bor.height, 9);
ASSERT_EQ(mar.width, 13);
ASSERT_EQ(mar.height, 11);
}

TEST_F(LayoutTest, FromDisplayNone) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap;
propertyMap["display"] = CSS::make_value(CSS::TextValue("none"));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap));

ASSERT_EQ(Box::from(styledNode, boxDimensions), nullptr);
}

TEST_F(LayoutTest, FromChildrenDisplayBlock) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap1;
propertyMap1["display"] = CSS::make_value(CSS::TextValue("block"));
Style::PropertyMap propertyMap2;
propertyMap2["display"] = CSS::make_value(CSS::TextValue("block"));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap1),
{Style::StyledNode(DOM::NodePtr(
new DOM::TextNode("")),
std::move(propertyMap2))});
auto box = Box::from(styledNode, boxDimensions);

ASSERT_EQ(box->getChildren().size(), 1);
}

TEST_F(LayoutTest, FromChildrenDisplayInline_One) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap1;
propertyMap1["display"] = CSS::make_value(CSS::TextValue("block"));
Style::PropertyMap propertyMap2;
propertyMap2["display"] = CSS::make_value(CSS::TextValue("inline"));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap1),
{Style::StyledNode(DOM::NodePtr(
new DOM::TextNode("")),
std::move(propertyMap2))});
auto box = Box::from(styledNode, boxDimensions);
auto children = box->getChildren();

ASSERT_EQ(children.size(), 1);
ASSERT_TRUE(dynamic_cast<AnonymousBox *>(children[0].get()));
ASSERT_EQ(children[0]->getChildren().size(), 1);
}

TEST_F(LayoutTest, FromChildrenDisplayInline_Multiple) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap1;
propertyMap1["display"] = CSS::make_value(CSS::TextValue("block"));
Style::PropertyMap propertyMap2;
propertyMap2["display"] = CSS::make_value(CSS::TextValue("inline"));
Style::PropertyMap propertyMap3;
propertyMap3["display"] = CSS::make_value(CSS::TextValue("inline"));
Style::PropertyMap propertyMap4;
propertyMap4["display"] = CSS::make_value(CSS::TextValue("inline"));
Style::StyledNode
styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap1),
{Style::StyledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap2)),
Style::StyledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap3)),
Style::StyledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap4))});
auto box = Box::from(styledNode, boxDimensions);
auto children = box->getChildren();

ASSERT_EQ(children.size(), 1);
ASSERT_TRUE(dynamic_cast<AnonymousBox *>(children[0].get()));
ASSERT_EQ(children[0]->getChildren().size(), 3);

for (const auto & child : children[0]->getChildren()) {
ASSERT_TRUE(dynamic_cast<StyledBox *>(child.get()));
}
}

TEST_F(LayoutTest, FromChildrenDisplayInline_Within_Inline) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap1;
propertyMap1["display"] = CSS::make_value(CSS::TextValue("block"));
Style::PropertyMap propertyMap2;
propertyMap2["display"] = CSS::make_value(CSS::TextValue("inline"));
Style::PropertyMap propertyMap3;
propertyMap3["display"] = CSS::make_value(CSS::TextValue("inline"));

auto iISN = Style::StyledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap3));
auto oISN = Style::StyledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap2),
{iISN});
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap1),
{oISN});
auto box = Box::from(styledNode, boxDimensions);
auto children = box->getChildren();

ASSERT_EQ(children.size(), 1);
ASSERT_TRUE(dynamic_cast<AnonymousBox *>(children[0].get()));

auto anonBox = children[0].get();

ASSERT_EQ(anonBox->getChildren().size(), 1);

auto outerNode = dynamic_cast<StyledBox *>(
anonBox->getChildren()[0].get())
->getContent();

ASSERT_EQ(outerNode.value("display")->print(), "inline");
ASSERT_EQ(anonBox->getChildren()[0]->getChildren().size(), 1);

auto innerNode = dynamic_cast<StyledBox *>(
anonBox->getChildren()[0]->getChildren()[0].get())
->getContent();

ASSERT_EQ(innerNode.value("display")->print(), "inline");
}

TEST_F(LayoutTest, FromChildrenDisplayNone) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap1;
propertyMap1["display"] = CSS::make_value(CSS::TextValue("block"));
Style::PropertyMap propertyMap2;
propertyMap2["display"] = CSS::make_value(CSS::TextValue("none"));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap1),
{Style::StyledNode(DOM::NodePtr(
new DOM::TextNode("")),
std::move(propertyMap2))});
auto box = Box::from(styledNode, boxDimensions);

ASSERT_EQ(box->getChildren().size(), 0);
}

TEST_F(LayoutTest, LayoutDisplayBlock) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap;
propertyMap["display"] = CSS::make_value(CSS::TextValue("block"));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap));

ASSERT_TRUE(
dynamic_cast<StyledBox *>(Box::from(styledNode, boxDimensions).get()));
}

TEST_F(LayoutTest, LayoutDisplayBlock_WidthGTContainer_NotAutoWidth) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap;
propertyMap["display"] = CSS::make_value(CSS::TextValue("block"));
propertyMap["width"] = CSS::make_value(CSS::UnitValue(0, CSS::px));
propertyMap["margin"] = CSS::make_value(CSS::TextValue("auto"));
propertyMap["padding"] = CSS::make_value(CSS::UnitValue(10, CSS::px));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap));
auto box = Box::from(styledNode, boxDimensions);
auto dims = box->getDimensions();

ASSERT_EQ(dims.width, 0);
ASSERT_EQ(dims.margin.left, 0);
ASSERT_EQ(dims.margin.right, -19);
}

TEST_F(LayoutTest, LayoutDisplayBlock_AllConstrained) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap;
propertyMap["display"] = CSS::make_value(CSS::TextValue("block"));
propertyMap["width"] = CSS::make_value(CSS::UnitValue(0, CSS::px));
propertyMap["margin"] = CSS::make_value(CSS::UnitValue(0, CSS::px));
propertyMap["padding"] = CSS::make_value(CSS::UnitValue(0, CSS::px));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap));
auto box = Box::from(styledNode, boxDimensions);
auto dims = box->getDimensions();

ASSERT_EQ(dims.width, 0);
ASSERT_EQ(dims.margin.left, 0);
ASSERT_EQ(dims.margin.right, 1);
}

TEST_F(LayoutTest, LayoutDisplayBlock_AutoMarginRight) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap;
propertyMap["display"] = CSS::make_value(CSS::TextValue("block"));
propertyMap["width"] = CSS::make_value(CSS::UnitValue(0, CSS::px));
propertyMap["margin"] = CSS::make_value(CSS::UnitValue(0, CSS::px));
propertyMap["margin-right"] = CSS::make_value(CSS::TextValue("auto"));
propertyMap["padding"] = CSS::make_value(CSS::UnitValue(0, CSS::px));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap));
auto box = Box::from(styledNode, boxDimensions);
auto dims = box->getDimensions();

ASSERT_EQ(dims.width, 0);
ASSERT_EQ(dims.margin.left, 0);
ASSERT_EQ(dims.margin.right, 1);
}

TEST_F(LayoutTest, LayoutDisplayBlock_AutoMarginLeft) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap;
propertyMap["display"] = CSS::make_value(CSS::TextValue("block"));
propertyMap["width"] = CSS::make_value(CSS::UnitValue(0, CSS::px));
propertyMap["margin"] = CSS::make_value(CSS::UnitValue(0, CSS::px));
propertyMap["margin-left"] = CSS::make_value(CSS::TextValue("auto"));
propertyMap["padding"] = CSS::make_value(CSS::UnitValue(0, CSS::px));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap));
auto box = Box::from(styledNode, boxDimensions);
auto dims = box->getDimensions();

ASSERT_EQ(dims.width, 0);
ASSERT_EQ(dims.margin.left, 1);
ASSERT_EQ(dims.margin.right, 0);
}

TEST_F(LayoutTest, LayoutDisplayBlock_AutoWidth_FitUnderflow) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap;
propertyMap["display"] = CSS::make_value(CSS::TextValue("block"));
propertyMap["width"] = CSS::make_value(CSS::TextValue("auto"));
propertyMap["margin"] = CSS::make_value(CSS::TextValue("auto"));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap));
auto box = Box::from(styledNode, boxDimensions);
auto dims = box->getDimensions();

ASSERT_EQ(dims.width, 1);
ASSERT_EQ(dims.margin.left, 0);
ASSERT_EQ(dims.margin.right, 0);
}

TEST_F(LayoutTest, LayoutDisplayBlock_AutoWidth_MarginRightFitUnderflow) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap;
propertyMap["display"] = CSS::make_value(CSS::TextValue("block"));
propertyMap["width"] = CSS::make_value(CSS::TextValue("auto"));
propertyMap["margin"] = CSS::make_value(CSS::TextValue("auto"));
propertyMap["padding"] = CSS::make_value(CSS::UnitValue(10, CSS::px));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap));
auto box = Box::from(styledNode, boxDimensions);
auto dims = box->getDimensions();

ASSERT_EQ(dims.width, 0);
ASSERT_EQ(dims.margin.left, 0);
ASSERT_EQ(dims.margin.right, -19);
}

TEST_F(LayoutTest, LayoutDisplayBlock_AutoLeftMargin_AutoRightMargin) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap;
propertyMap["display"] = CSS::make_value(CSS::TextValue("block"));
propertyMap["width"] = CSS::make_value(CSS::UnitValue(0, CSS::px));
propertyMap["margin"] = CSS::make_value(CSS::TextValue("auto"));
propertyMap["padding"] = CSS::make_value(CSS::UnitValue(0, CSS::px));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap));
auto box = Box::from(styledNode, boxDimensions);
auto dims = box->getDimensions();

ASSERT_EQ(dims.width, 0);
ASSERT_EQ(dims.margin.left, 0.5);
ASSERT_EQ(dims.margin.right, 0.5);
}

TEST_F(LayoutTest, LayoutDisplayInline) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap;
propertyMap["display"] = CSS::make_value(CSS::TextValue("inline"));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap));

ASSERT_TRUE(
dynamic_cast<StyledBox *>(Box::from(styledNode, boxDimensions).get()));
}

TEST_F(LayoutTest, SetHeightExplicitly) {
BoxDimensions boxDimensions(Rectangle(0, 0, 1, 1));
Style::PropertyMap propertyMap;
propertyMap["display"] = CSS::make_value(CSS::TextValue("block"));
propertyMap["height"] = CSS::make_value(CSS::UnitValue(50, CSS::px));
Style::StyledNode styledNode(DOM::NodePtr(new DOM::TextNode("")),
std::move(propertyMap));
auto box = Box::from(styledNode, boxDimensions);
auto dims = box->getDimensions();

ASSERT_EQ(dims.height, 50);
}
1 change: 1 addition & 0 deletions tests/style.cpp
Expand Up @@ -21,6 +21,7 @@ TEST_F(StyleTest, value) {
auto root = StyledNode::from(html.evaluate(), css.evaluate());
ASSERT_EQ(root.value("font-size")->print(), "15px");
ASSERT_EQ(root.value("font-size", "other-size", "rah")->print(), "15px");
ASSERT_EQ(root.value("font-size", "font-size")->print(), "15px");
ASSERT_EQ(root.value("other-size", "font-size", "rah")->print(), "15px");
ASSERT_EQ(root.value("other-size", "another-size"), nullptr);
ASSERT_EQ(root.value_or("font-size", CSS::TextValue("NO VALUE"))->print(),
Expand Down

0 comments on commit 3d04a48

Please sign in to comment.