hemplateSimple XML template engine |
git clone git://git.dimitrijedobrota.com/hemplate.git |
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |
commit | 14c196fa229e9b4baf62db69d4730d64367b769b |
parent | cac6d73e0f4c4f674875a911c1f4946d7bc690cb |
author | Dimitrije Dobrota < mail@dimitrijedobrota.com > |
date | Wed, 23 Apr 2025 15:25:47 +0200 |
Attribute_list test and bug fixing
M | include/hemplate/attribute.hpp | | | ++++++++ ------ |
M | include/hemplate/element.hpp | | | -- |
M | source/attribute.cpp | | | ++ -------- |
M | test/CMakeLists.txt | | | + |
A | test/source/attribute_list.cpp | | | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
5 files changed, 103 insertions(+), 16 deletions(-)
diff --git a/ include/hemplate/attribute.hpp b/ include/hemplate/attribute.hpp
@@ -26,7 +26,7 @@
public:
{
}
operator std::string() const // NOLINT *-explicit-constructor
explicit operator std::string() const
{
if (empty()) {
return name();
@@ -58,27 +58,29 @@
public:
attribute_list add(const attribute_list& list) const;
attribute_list add(attribute attr) const;
bool empty() const;
explicit operator std::string() const
{
std::string res;
if (!m_class.empty()) {
res += m_class;
res += std::string(m_class);
res += ' ';
}
if (!m_style.empty()) {
res += m_style;
res += std::string(m_style);
res += ' ';
}
for (const auto& attr : m_attributes) {
res += attr;
res += std::string(attr);
res += ' ';
}
if (!res.empty()) {
res.pop_back();
}
return res;
}
diff --git a/ include/hemplate/element.hpp b/ include/hemplate/element.hpp
@@ -31,8 +31,6 @@
public:
const attribute_list& attributes() const { return *this; }
private:
using attribute_list::empty;
template<based::string_literal Tag, element::Type MyType>
friend class element_builder;
diff --git a/ source/attribute.cpp b/ source/attribute.cpp
@@ -26,20 +26,14 @@
attribute_list::attribute_list(attribute attr)
set(std::move(attr));
}
bool attribute_list::empty() const
{
return m_attributes.empty() && m_class.value().empty()
&& m_style.value().empty();
}
attribute_list& attribute_list::set(const attribute_list& list)
{
for (const auto& attr : list.m_attributes) {
set(attr);
}
set(m_class);
set(m_style);
set(list.m_class);
set(list.m_style);
return (*this);
}
diff --git a/ test/CMakeLists.txt b/ test/CMakeLists.txt
@@ -22,6 +22,7 @@
function(add_test NAME)
endfunction()
add_test(attribute)
add_test(attribute_list)
# ---- End-of-file commands ----
diff --git a/ test/source/attribute_list.cpp b/ test/source/attribute_list.cpp
@@ -0,0 +1,92 @@
#include "hemplate/attribute.hpp"
#include <catch2/catch_test_macros.hpp>
// NOLINTBEGIN readability-container-size-empty
TEST_CASE("set class", "[attribute_list]")
{
hemplate::attribute_list attrs = hemplate::attribute {"class", "first"};
REQUIRE(std::string(attrs) == R"(class="first")");
SECTION("second")
{
attrs.set({"class", "second"});
REQUIRE(std::string(attrs) == R"(class="first second")");
}
SECTION("random")
{
attrs.set({"test"});
REQUIRE(std::string(attrs) == R"(class="first" test)");
}
}
TEST_CASE("set style", "[attribute_list]")
{
hemplate::attribute_list attrs = hemplate::attribute {"style", "first"};
REQUIRE(std::string(attrs) == R"(style="first")");
SECTION("second")
{
attrs.set({"style", "second"});
REQUIRE(std::string(attrs) == R"(style="first; second")");
}
SECTION("random")
{
attrs.set({"test"});
REQUIRE(std::string(attrs) == R"(style="first" test)");
}
}
TEST_CASE("set list", "[attribute_list]")
{
hemplate::attribute_list attrs {
{"class", "first"},
{"style", "first"},
{"test_first"},
{"class", "second"},
{"style", "second"},
{"test_second"},
};
REQUIRE(
std::string(attrs)
== R"(class="first second" style="first; second" test_first test_second)");
SECTION("set")
{
attrs.set({
{"class", "third"},
{"style", "third"},
{"test_third"},
});
REQUIRE(
std::string(attrs)
== R"(class="first second third" style="first; second; third" test_first test_second test_third)");
}
}
TEST_CASE("add", "[attribute_list]")
{
using namespace std::literals::string_view_literals;
const auto attrs = hemplate::attribute_list {}
.add({"class", "first"})
.add({
{"class"sv, "second"sv},
{"class"sv, "third"sv},
});
REQUIRE(std::string(attrs) == R"(class="first second third")");
}
// NOLINTEND readability-container-size-empty