diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 6df81f4..fa59e39 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -60,7 +60,9 @@ jobs: - name: Generate coverage report run: | - lcov -d . -c -o out.info --rc lcov_branch_coverage=1 --no-external --filter branch --filter line + lcov --version + lcov --help + lcov -d . -c -o out.info --rc lcov_branch_coverage=1 --no-external lcov -e out.info '*include/ss*hpp' -o filtered.info - name: Invoke coveralls diff --git a/include/ss/parser.hpp b/include/ss/parser.hpp index ac6f204..72ed190 100644 --- a/include/ss/parser.hpp +++ b/include/ss/parser.hpp @@ -920,7 +920,6 @@ private: } size_t remove_eol(char*& buffer, size_t ssize) { - // TODO write unit tests if (buffer[ssize - 1] != '\n') { return ssize; } @@ -943,7 +942,6 @@ private: buffer_size = first_size + second_size + 3; auto new_first = static_cast( realloc(static_cast(first), buffer_size)); - // TODO check if (!new_first) { throw std::bad_alloc{}; } diff --git a/test/test_parser1.hpp b/test/test_parser1.hpp index a0fd9ce..90267c8 100644 --- a/test/test_parser1.hpp +++ b/test/test_parser1.hpp @@ -80,7 +80,8 @@ std::enable_if_t, bool> operator==(const T& lhs, template static void make_and_write(const std::string& file_name, const std::vector& data, - const std::vector& header = {}) { + const std::vector& header = {}, + bool new_line_eof = true) { std::ofstream out{file_name}; #ifdef _WIN32 @@ -101,7 +102,10 @@ static void make_and_write(const std::string& file_name, } for (size_t i = 0; i < data.size(); ++i) { - out << data[i].to_string() << new_lines[i % new_lines.size()]; + out << data[i].to_string(); + if (new_line_eof || i + 1 < data.size()) { + out << new_lines[i % new_lines.size()]; + } } } diff --git a/test/test_parser1_1.cpp b/test/test_parser1_1.cpp index 26e463e..4c8d476 100644 --- a/test/test_parser1_1.cpp +++ b/test/test_parser1_1.cpp @@ -551,3 +551,32 @@ TEST_CASE("parser test composite conversion") { test_composite_conversion(); test_composite_conversion(); } + +template +void test_no_new_line_at_eof_impl(const std::vector& data) { + unique_file_name f{"test_parser"}; + make_and_write(f.name, data, {}, false); + + auto [p, _] = make_parser(f.name); + std::vector parsed_data; + + for (const auto& el : p.template iterate()) { + parsed_data.push_back(el); + } + + CHECK_EQ(data, parsed_data); +} + +template +void test_no_new_line_at_eof() { + test_no_new_line_at_eof_impl({}); + test_no_new_line_at_eof_impl({{1, 2, "X"}}); + test_no_new_line_at_eof_impl({{1, 2, "X"}, {3, 4, "YY"}}); + test_no_new_line_at_eof_impl( + {{1, 2, "X"}, {3, 4, "YY"}, {5, 6, "ZZZ"}, {7, 8, "UUU"}}); +} + +TEST_CASE("test no new line at end of data") { + test_no_new_line_at_eof(); + test_no_new_line_at_eof(); +}