1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef TEST_STD_INPUT_OUTPUT_IOSTREAM_FORMAT_OUTPUT_STREAMS_OSTREAM_FORMATTED_OSTREAM_FORMATTED_PRINT_PRINT_TESTS_H
10#define TEST_STD_INPUT_OUTPUT_IOSTREAM_FORMAT_OUTPUT_STREAMS_OSTREAM_FORMATTED_OSTREAM_FORMATTED_PRINT_PRINT_TESTS_H
11
12template <class TestFunction, class ExceptionTest>
13void print_tests(TestFunction check, ExceptionTest check_exception) {
14 // *** Test escaping ***
15
16 check("{", "{{");
17 check("{:^}", "{{:^}}");
18 check("{: ^}", "{{:{}^}}", ' ');
19 check("{:{}^}", "{{:{{}}^}}");
20 check("{:{ }^}", "{{:{{{}}}^}}", ' ');
21
22 // *** Test argument ID ***
23 check("hello false true", "hello {0:} {1:}", false, true);
24 check("hello true false", "hello {1:} {0:}", false, true);
25
26 // *** Test many arguments ***
27 check(
28 "1234567890\t1234567890",
29 "{}{}{}{}{}{}{}{}{}{}\t{}{}{}{}{}{}{}{}{}{}",
30 1,
31 2,
32 3,
33 4,
34 5,
35 6,
36 7,
37 8,
38 9,
39 0,
40 1,
41 2,
42 3,
43 4,
44 5,
45 6,
46 7,
47 8,
48 9,
49 0);
50
51 // *** Test embedded NUL character ***
52 using namespace std::literals;
53 check("hello\0world"sv, "hello{}{}", '\0', "world");
54 check("hello\0world"sv, "hello\0{}"sv, "world");
55 check("hello\0world"sv, "hello{}", "\0world"sv);
56
57 // *** Test Unicode ***
58 // 2-byte code points
59 check("\u00a1"sv, "{}"sv, "\u00a1"); // INVERTED EXCLAMATION MARK
60 check("\u07ff"sv, "{:}"sv, "\u07ff"); // NKO TAMAN SIGN
61
62 // 3-byte code points
63 check("\u0800"sv, "{}"sv, "\u0800"); // SAMARITAN LETTER ALAF
64 check("\ufffd"sv, "{}"sv, "\ufffd"); // REPLACEMENT CHARACTER
65
66 // 4-byte code points
67 check("\U00010000"sv, "{}"sv, "\U00010000"); // LINEAR B SYLLABLE B008 A
68 check("\U0010FFFF"sv, "{}"sv, "\U0010FFFF"); // Undefined Character
69
70 // *** Test invalid format strings ***
71 check_exception("The format string terminates at a '{'", "{");
72 check_exception("The replacement field misses a terminating '}'", "{:", 42);
73
74 check_exception("The format string contains an invalid escape sequence", "}");
75 check_exception("The format string contains an invalid escape sequence", "{:}-}", 42);
76
77 check_exception("The format string contains an invalid escape sequence", "} ");
78 check_exception("The argument index starts with an invalid character", "{-", 42);
79 check_exception("The argument index value is too large for the number of arguments supplied", "hello {}");
80 check_exception("The argument index value is too large for the number of arguments supplied", "hello {0}");
81 check_exception("The argument index value is too large for the number of arguments supplied", "hello {1}", 42);
82}
83
84#endif // TEST_STD_INPUT_OUTPUT_IOSTREAM_FORMAT_OUTPUT_STREAMS_OSTREAM_FORMATTED_OSTREAM_FORMATTED_PRINT_PRINT_TESTS_H
85

source code of libcxx/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.formatted.print/print_tests.h