File: print_tests.h

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 1,998,492 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (83 lines) | stat: -rw-r--r-- 2,940 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//===----------------------------------------------------------------------===//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef TEST_STD_INPUT_OUTPUT_IOSTREAM_FORMAT_PRINT_FUN_PRINT_TESTS_H
#define TEST_STD_INPUT_OUTPUT_IOSTREAM_FORMAT_PRINT_FUN_PRINT_TESTS_H

template <class TestFunction, class ExceptionTest>
void print_tests(TestFunction check, ExceptionTest check_exception) {
  // *** Test escaping  ***

  check("{", "{{");
  check("{:^}", "{{:^}}");
  check("{: ^}", "{{:{}^}}", ' ');
  check("{:{}^}", "{{:{{}}^}}");
  check("{:{ }^}", "{{:{{{}}}^}}", ' ');

  // *** Test argument ID ***
  check("hello false true", "hello {0:} {1:}", false, true);
  check("hello true false", "hello {1:} {0:}", false, true);

  // *** Test many arguments ***
  check(
      "1234567890\t1234567890",
      "{}{}{}{}{}{}{}{}{}{}\t{}{}{}{}{}{}{}{}{}{}",
      1,
      2,
      3,
      4,
      5,
      6,
      7,
      8,
      9,
      0,
      1,
      2,
      3,
      4,
      5,
      6,
      7,
      8,
      9,
      0);

  // *** Test embedded NUL character ***
  using namespace std::literals;
  check("hello\0world"sv, "hello{}{}", '\0', "world");
  check("hello\0world"sv, "hello\0{}"sv, "world");
  check("hello\0world"sv, "hello{}", "\0world"sv);

  // *** Test Unicode ***
  // 2-byte code points
  check("\u00a1"sv, "{}"sv, "\u00a1");  // INVERTED EXCLAMATION MARK
  check("\u07ff"sv, "{:}"sv, "\u07ff"); // NKO TAMAN SIGN

  // 3-byte code points
  check("\u0800"sv, "{}"sv, "\u0800"); // SAMARITAN LETTER ALAF
  check("\ufffd"sv, "{}"sv, "\ufffd"); // REPLACEMENT CHARACTER

  // 4-byte code points
  check("\U00010000"sv, "{}"sv, "\U00010000"); // LINEAR B SYLLABLE B008 A
  check("\U0010FFFF"sv, "{}"sv, "\U0010FFFF"); // Undefined Character

  // *** Test invalid format strings ***
  check_exception("The format string terminates at a '{'", "{");
  check_exception("The replacement field misses a terminating '}'", "{:", 42);

  check_exception("The format string contains an invalid escape sequence", "}");
  check_exception("The format string contains an invalid escape sequence", "{:}-}", 42);

  check_exception("The format string contains an invalid escape sequence", "} ");
  check_exception("The argument index starts with an invalid character", "{-", 42);
  check_exception("The argument index value is too large for the number of arguments supplied", "hello {}");
  check_exception("The argument index value is too large for the number of arguments supplied", "hello {0}");
  check_exception("The argument index value is too large for the number of arguments supplied", "hello {1}", 42);
}

#endif // TEST_STD_INPUT_OUTPUT_IOSTREAM_FORMAT_PRINT_FUN_PRINT_TESTS_H