From 4b83468eb94a4fd0b105d4fa317706ec52487341 Mon Sep 17 00:00:00 2001 From: patrick96 Date: Sat, 28 Apr 2018 23:18:02 +0200 Subject: [PATCH] refactor(builder): Add failing test for ellipsis Adds failing tests for the bug described in #1194 --- include/components/builder.hpp | 2 + src/CMakeLists.txt | 2 + src/components/builder.cpp | 16 +++-- tests/CMakeLists.txt | 9 ++- tests/unit_tests/components/builder.cpp | 79 +++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 tests/unit_tests/components/builder.cpp diff --git a/include/components/builder.hpp b/include/components/builder.hpp index 4a5b8066..03eddfc7 100644 --- a/include/components/builder.hpp +++ b/include/components/builder.hpp @@ -59,6 +59,8 @@ class builder { string background_hex(); string foreground_hex(); + string get_label_text(const label_t& label); + void tag_open(syntaxtag tag, const string& value); void tag_open(attribute attr); void tag_close(syntaxtag tag); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e0bae708..e9a8e9a1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -95,5 +95,7 @@ endif() # }}} +# Export source file list so that it can be used for test compilation +set(files ${files} PARENT_SCOPE) set(libs ${libs} PARENT_SCOPE) set(dirs ${dirs} PARENT_SCOPE) diff --git a/src/components/builder.cpp b/src/components/builder.cpp index 6804872a..ae697b11 100644 --- a/src/components/builder.cpp +++ b/src/components/builder.cpp @@ -206,11 +206,7 @@ void builder::node(const label_t& label, bool add_space) { return; } - string text{label->get()}; - - if (label->m_maxlen > 0 && string_util::char_len(text) > label->m_maxlen) { - text = string_util::utf8_truncate(std::move(text), label->m_maxlen) + "..."; - } + auto text = get_label_text(label); // if ((label->m_overline.empty() && m_tags[syntaxtag::o] > 0) || (m_tags[syntaxtag::o] > 0 && label->m_margin > 0)) // overline_close(); @@ -556,6 +552,16 @@ string builder::foreground_hex() { return m_foreground; } +string builder::get_label_text(const label_t& label) { + string text{label->get()}; + + if (label->m_maxlen > 0 && string_util::char_len(text) > label->m_maxlen) { + text = string_util::utf8_truncate(std::move(text), label->m_maxlen) + "..."; + } + + return text; +} + /** * Insert directive to change value of given tag */ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f5e52f59..86f66edf 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -44,7 +44,10 @@ function(unit_test file tests) # unit_test function become cleaner SET(sources "") FOREACH(f ${BIN_SOURCES}) - LIST(APPEND sources "../src/${f}") + # Do not add main.cpp, because it will override the main function + if(NOT "${f}" STREQUAL "main.cpp") + LIST(APPEND sources "../src/${f}") + endif() ENDFOREACH(f) string(REPLACE "/" "_" testname ${file}) @@ -84,5 +87,9 @@ unit_test(components/command_line unit_tests utils/string.cpp) unit_test(components/bar unit_tests) +unit_test(components/builder unit_tests + SOURCES + ${files}) + # Compile all unit tests with 'make all_unit_tests' add_custom_target("all_unit_tests" DEPENDS ${unit_tests}) diff --git a/tests/unit_tests/components/builder.cpp b/tests/unit_tests/components/builder.cpp new file mode 100644 index 00000000..bee20fc8 --- /dev/null +++ b/tests/unit_tests/components/builder.cpp @@ -0,0 +1,79 @@ +#include + +#include "common/test.hpp" +#include "components/builder.hpp" +#include "components/types.hpp" +#include "utils/factory.hpp" +#include "drawtypes/label.hpp" + +using namespace polybar; +using namespace std; + +/** + * \brief Testing-only subclass of builder to change access level + */ +class TestableBuilder : public builder { + using builder::builder; + public: using builder::get_label_text; +}; + +class Builder : public ::testing::Test { + protected: + + /** + * Generic bar settings + * + * Builder only needs spacing and background + */ + bar_settings m_bar{}; + TestableBuilder m_builder{m_bar}; +}; + +// GetLabelTextTest {{{ + +/** + * \brief Class for parameterized tests on get_label_text + * + * The first element of the pair is the expected returned text, the second + * element is a triple containing the original label text, m_ellipsis and + * m_maxlen, in that order + */ +class GetLabelTextTest : + public Builder, + public ::testing::WithParamInterface>> {}; + +vector>> get_label_text_list = { + {"...", make_tuple("abcd", true, 3)}, + {"abc", make_tuple("abcdefgh", false, 3)}, + {"a...", make_tuple("abcdefgh", true, 4)}, + {"abcd...", make_tuple("abcdefgh", true, 7)}, + {"abcdefgh", make_tuple("abcdefgh", true, 8)}, +}; + +INSTANTIATE_TEST_CASE_P(Inst, GetLabelTextTest, + ::testing::ValuesIn(get_label_text_list),); + +TEST_P(GetLabelTextTest, correctness) { + label_t m_label = factory_util::shared