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