fmt/test/output-range-test.cc
2023-12-15 14:27:40 -05:00

197 lines
7.5 KiB
C++

// Formatting library for C++ - std::ostream support tests
//
// Copyright (c) 2012 - present, Victor Zverovich
// All rights reserved.
//
// For the license information refer to format.h.
#include "fmt/format.h"
#if FMT_OUTPUT_RANGES
# include <array>
# include <deque>
# include <list>
# include <span>
# include <vector>
# include "gmock/gmock.h"
# include "gtest-extra.h"
# include "util.h"
TEST(output_range_c_array_char_test, format_into) {
char buffer[4];
buffer[3] = 'x';
auto result = fmt::format_into(buffer, "{}", "abc");
EXPECT_EQ(buffer + 3, result.begin());
EXPECT_EQ("abc", fmt::string_view(buffer, 3));
EXPECT_EQ("abcx", fmt::string_view(buffer, 4));
result = fmt::format_into(buffer, "x{}y", "abc");
EXPECT_EQ(buffer + 4, result.begin());
EXPECT_EQ("xabc", fmt::string_view(buffer, 4));
}
TEST(output_range_array_char_test, format_into) {
std::array<char, 4> buffer;
buffer[3] = 'x';
auto result = fmt::format_into(buffer, "{}", "abc");
EXPECT_EQ(buffer.begin() + 3, result.begin());
EXPECT_EQ("abc", fmt::string_view(buffer.data(), 3));
EXPECT_EQ("abcx", fmt::string_view(buffer.data(), 4));
result = fmt::format_into(buffer, "x{}y", "abc");
EXPECT_EQ(buffer.begin() + 4, result.begin());
EXPECT_EQ("xabc", fmt::string_view(buffer.data(), 4));
}
TEST(output_range_span_array_char_test, format_into) {
std::array<char, 4> storage;
std::span<char> buffer(storage);
buffer[3] = 'x';
auto result = fmt::format_into(buffer, "{}", "abc");
EXPECT_EQ(buffer.begin() + 3, result.begin());
EXPECT_EQ("abc", fmt::string_view(buffer.data(), 3));
EXPECT_EQ("abcx", fmt::string_view(buffer.data(), 4));
result = fmt::format_into(buffer, "x{}y", "abc");
EXPECT_EQ(buffer.begin() + 4, result.begin());
EXPECT_EQ("xabc", fmt::string_view(buffer.data(), 4));
}
TEST(output_range_vector_char_test, format_into) {
std::vector<char> buffer(4, '\0');
buffer[3] = 'x';
auto result = fmt::format_into(buffer, "{}", "abc");
EXPECT_EQ(buffer.begin() + 3, result.begin());
EXPECT_EQ("abc", fmt::string_view(buffer.data(), 3));
EXPECT_EQ("abcx", fmt::string_view(buffer.data(), 4));
result = fmt::format_into(buffer, "x{}y", "abc");
EXPECT_EQ(buffer.begin() + 4, result.begin());
EXPECT_EQ("xabc", fmt::string_view(buffer.data(), 4));
}
TEST(output_range_list_char_test, format_into) {
std::list<char> buffer(4, '\0');
using subrng = std::ranges::subrange<typename decltype(buffer)::iterator>;
auto fourth_it = std::ranges::next(buffer.begin(), 3);
auto end = buffer.end();
subrng first3_subrange(buffer.begin(), fourth_it);
*fourth_it = 'x';
auto result = fmt::format_into(buffer, "{}", "abc");
EXPECT_EQ(fourth_it, result.begin());
EXPECT_TRUE(std::ranges::equal(fmt::string_view("abc"), first3_subrange));
EXPECT_TRUE(std::ranges::equal(fmt::string_view("abcx"), buffer));
result = fmt::format_into(buffer, "x{}y", "abc");
EXPECT_EQ(end, result.begin());
EXPECT_TRUE(std::ranges::equal(fmt::string_view("xabc"), buffer));
}
TEST(output_range_deque_char_test, format_into) {
std::deque<char> buffer(4, '\0');
using subrng = std::ranges::subrange<typename decltype(buffer)::iterator>;
auto fourth_it = std::ranges::next(buffer.begin(), 3);
auto end = buffer.end();
subrng first3_subrange(buffer.begin(), fourth_it);
*fourth_it = 'x';
auto result = fmt::format_into(buffer, "{}", "abc");
EXPECT_EQ(fourth_it, result.begin());
EXPECT_TRUE(std::ranges::equal(fmt::string_view("abc"), first3_subrange));
EXPECT_TRUE(std::ranges::equal(fmt::string_view("abcx"), buffer));
result = fmt::format_into(buffer, "x{}y", "abc");
EXPECT_EQ(end, result.begin());
EXPECT_TRUE(std::ranges::equal(fmt::string_view("xabc"), buffer));
}
TEST(output_range_c_array_char_test, format_to) {
char buffer[4];
buffer[3] = 'x';
auto result = fmt::format_to(buffer, "{}", "abc");
EXPECT_EQ(buffer + 3, result.begin());
EXPECT_EQ("abc", fmt::string_view(buffer, 3));
EXPECT_EQ("abcx", fmt::string_view(buffer, 4));
result = fmt::format_to(buffer, "x{}y", "abc");
EXPECT_EQ(buffer + 4, result.begin());
EXPECT_EQ("xabc", fmt::string_view(buffer, 4));
}
TEST(output_range_array_char_test, format_to) {
std::array<char, 4> buffer;
buffer[3] = 'x';
auto result = fmt::format_to(buffer, "{}", "abc");
EXPECT_EQ(buffer.begin() + 3, result.begin());
EXPECT_EQ("abc", fmt::string_view(buffer.data(), 3));
EXPECT_EQ("abcx", fmt::string_view(buffer.data(), 4));
result = fmt::format_to(buffer, "x{}y", "abc");
EXPECT_EQ(buffer.begin() + 4, result.begin());
EXPECT_EQ("xabc", fmt::string_view(buffer.data(), 4));
}
TEST(output_range_span_array_char_test, format_to) {
std::array<char, 4> storage;
std::span<char> buffer(storage);
buffer[3] = 'x';
auto result = fmt::format_to(buffer, "{}", "abc");
EXPECT_EQ(buffer.begin() + 3, result.begin());
EXPECT_EQ("abc", fmt::string_view(buffer.data(), 3));
EXPECT_EQ("abcx", fmt::string_view(buffer.data(), 4));
result = fmt::format_to(buffer, "x{}y", "abc");
EXPECT_EQ(buffer.begin() + 4, result.begin());
EXPECT_EQ("xabc", fmt::string_view(buffer.data(), 4));
}
TEST(output_range_vector_char_test, format_to) {
std::vector<char> buffer{};
auto result = fmt::format_to(buffer, "{}", "abc");
EXPECT_EQ(buffer.begin() + 3, result.begin());
EXPECT_EQ("abc", fmt::string_view(buffer.data(), 3));
result = fmt::format_to(buffer, "x{}y", "abc");
EXPECT_EQ(buffer.begin() + 8, result.begin());
EXPECT_EQ(buffer.begin() + (std::ptrdiff_t)buffer.size(), result.begin());
EXPECT_EQ(buffer.end(), result.begin());
EXPECT_EQ("abcxabcy", fmt::string_view(buffer.data(), 8));
}
TEST(output_range_basic_string_char_test, format_to) {
std::string buffer{};
auto result = fmt::format_to(buffer, "{}", "abc");
EXPECT_EQ(buffer.begin() + 3, result.begin());
EXPECT_EQ("abc", buffer);
result = fmt::format_to(buffer, "x{}y", "abc");
EXPECT_EQ(buffer.begin() + 8, result.begin());
EXPECT_EQ(buffer.begin() + (std::ptrdiff_t)buffer.size(), result.begin());
EXPECT_EQ(buffer.end(), result.begin());
EXPECT_EQ("abcxabcy", buffer);
}
TEST(output_range_list_char_test, format_to) {
std::list<char> buffer{};
auto result = fmt::format_to(buffer, "{}", "abc");
EXPECT_EQ(buffer.end(), result.begin());
EXPECT_EQ(std::ranges::next(buffer.begin(), 3), result.begin());
EXPECT_EQ(std::ranges::next(buffer.begin(), (std::ptrdiff_t)buffer.size()),
result.begin());
EXPECT_TRUE(std::ranges::equal(fmt::string_view("abc"), buffer));
result = fmt::format_to(buffer, "x{}y", "abc");
EXPECT_EQ(buffer.end(), result.begin());
EXPECT_EQ(std::ranges::next(buffer.begin(), 8), result.begin());
EXPECT_EQ(std::ranges::next(buffer.begin(), (std::ptrdiff_t)buffer.size()),
result.begin());
EXPECT_TRUE(std::ranges::equal(fmt::string_view("abcxabcy"), buffer));
}
TEST(output_range_deque_char_test, format_to) {
std::deque<char> buffer{};
auto result = fmt::format_to(buffer, "{}", "abc");
EXPECT_EQ(buffer.end(), result.begin());
EXPECT_EQ(std::ranges::next(buffer.begin(), 3), result.begin());
EXPECT_EQ(std::ranges::next(buffer.begin(), (std::ptrdiff_t)buffer.size()),
result.begin());
EXPECT_TRUE(std::ranges::equal(fmt::string_view("abc"), buffer));
result = fmt::format_to(buffer, "x{}y", "abc");
EXPECT_EQ(buffer.end(), result.begin());
EXPECT_EQ(std::ranges::next(buffer.begin(), 8), result.begin());
EXPECT_EQ(std::ranges::next(buffer.begin(), (std::ptrdiff_t)buffer.size()),
result.begin());
EXPECT_TRUE(std::ranges::equal(fmt::string_view("abcxabcy"), buffer));
}
#endif