// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 // UNSUPPORTED: no-filesystem // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME // XFAIL: msvc, target={{.+}}-windows-gnu // XFAIL: availability-fp_to_chars-missing // // The FILE returned by fmemopen does not have file descriptor. // This means the test could fail when the implementation uses a // function that requires a file descriptor, for example write. // // This tests all print functions which takes a FILE* as argument. // template // void print(FILE* stream, format_string fmt, Args&&... args); // template // void println(FILE* stream, format_string fmt, Args&&... args); // void vprint_unicode(FILE* stream, string_view fmt, format_args args); // void vprint_nonunicode(FILE* stream, string_view fmt, format_args args); #include #include #include #include static void test_print() { std::array buffer{0}; FILE* file = fmemopen(buffer.data(), buffer.size(), "wb"); assert(file); std::print(file, "hello world{}", '!'); long pos = std::ftell(file); std::fclose(file); assert(pos > 0); assert(std::string_view(buffer.data(), pos) == "hello world!"); } static void test_println() { std::array buffer{0}; FILE* file = fmemopen(buffer.data(), buffer.size(), "wb"); assert(file); std::println(file, "hello world{}", '!'); long pos = std::ftell(file); std::fclose(file); assert(pos > 0); assert(std::string_view(buffer.data(), pos) == "hello world!\n"); } static void test_vprint_unicode() { std::array buffer{0}; FILE* file = fmemopen(buffer.data(), buffer.size(), "wb"); assert(file); std::vprint_unicode(file, "hello world{}", std::make_format_args('!')); long pos = std::ftell(file); std::fclose(file); assert(pos > 0); assert(std::string_view(buffer.data(), pos) == "hello world!"); } static void test_vprint_nonunicode() { std::array buffer{0}; FILE* file = fmemopen(buffer.data(), buffer.size(), "wb"); assert(file); std::vprint_nonunicode(file, "hello world{}", std::make_format_args('!')); long pos = std::ftell(file); std::fclose(file); assert(pos > 0); assert(std::string_view(buffer.data(), pos) == "hello world!"); } int main(int, char**) { test_print(); test_println(); test_vprint_unicode(); test_vprint_nonunicode(); return 0; }