xref: /llvm-project/libc/test/UnitTest/PrintfMatcher.cpp (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
1af1315c2SSiva Chandra Reddy //===-- PrintfMatcher.cpp ---------------------------------------*- C++ -*-===//
2af1315c2SSiva Chandra Reddy //
3af1315c2SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4af1315c2SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5af1315c2SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6af1315c2SSiva Chandra Reddy //
7af1315c2SSiva Chandra Reddy //===----------------------------------------------------------------------===//
8af1315c2SSiva Chandra Reddy 
9af1315c2SSiva Chandra Reddy #include "PrintfMatcher.h"
10af1315c2SSiva Chandra Reddy 
11af1315c2SSiva Chandra Reddy #include "src/__support/FPUtil/FPBits.h"
12*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h"
13af1315c2SSiva Chandra Reddy #include "src/stdio/printf_core/core_structs.h"
14af1315c2SSiva Chandra Reddy 
15af1315c2SSiva Chandra Reddy #include "test/UnitTest/StringUtils.h"
16dcf296b5SSiva Chandra Reddy #include "test/UnitTest/Test.h"
17af1315c2SSiva Chandra Reddy 
18af1315c2SSiva Chandra Reddy #include <stdint.h>
19af1315c2SSiva Chandra Reddy 
20*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL {
21af1315c2SSiva Chandra Reddy namespace testing {
22af1315c2SSiva Chandra Reddy 
230fd0b742SGuillaume Chatelet using printf_core::FormatFlags;
240fd0b742SGuillaume Chatelet using printf_core::FormatSection;
250fd0b742SGuillaume Chatelet using printf_core::LengthModifier;
260fd0b742SGuillaume Chatelet 
27af1315c2SSiva Chandra Reddy bool FormatSectionMatcher::match(FormatSection actualValue) {
28af1315c2SSiva Chandra Reddy   actual = actualValue;
29af1315c2SSiva Chandra Reddy   return expected == actual;
30af1315c2SSiva Chandra Reddy }
31af1315c2SSiva Chandra Reddy 
32af1315c2SSiva Chandra Reddy namespace {
33af1315c2SSiva Chandra Reddy 
34af1315c2SSiva Chandra Reddy #define IF_FLAG_SHOW_FLAG(flag_name)                                           \
35af1315c2SSiva Chandra Reddy   do {                                                                         \
36af1315c2SSiva Chandra Reddy     if ((form.flags & FormatFlags::flag_name) == FormatFlags::flag_name)       \
37dcf296b5SSiva Chandra Reddy       tlog << "\n\t\t" << #flag_name;                                          \
38af1315c2SSiva Chandra Reddy   } while (false)
39af1315c2SSiva Chandra Reddy #define CASE_LM(lm)                                                            \
40af1315c2SSiva Chandra Reddy   case (LengthModifier::lm):                                                   \
41dcf296b5SSiva Chandra Reddy     tlog << #lm;                                                               \
42af1315c2SSiva Chandra Reddy     break
43fdef5c4fSOm Prakaash #define CASE_LM_BIT_WIDTH(lm, bw)                                              \
44fdef5c4fSOm Prakaash   case (LengthModifier::lm):                                                   \
45fdef5c4fSOm Prakaash     tlog << #lm << "\n\tbit width: :" << bw;                                   \
46fdef5c4fSOm Prakaash     break
47af1315c2SSiva Chandra Reddy 
48dcf296b5SSiva Chandra Reddy static void display(FormatSection form) {
49dcf296b5SSiva Chandra Reddy   tlog << "Raw String (len " << form.raw_string.size() << "): \"";
50af1315c2SSiva Chandra Reddy   for (size_t i = 0; i < form.raw_string.size(); ++i) {
51dcf296b5SSiva Chandra Reddy     tlog << form.raw_string[i];
52af1315c2SSiva Chandra Reddy   }
53dcf296b5SSiva Chandra Reddy   tlog << "\"";
54af1315c2SSiva Chandra Reddy   if (form.has_conv) {
55dcf296b5SSiva Chandra Reddy     tlog << "\n\tHas Conv\n\tFlags:";
56af1315c2SSiva Chandra Reddy     IF_FLAG_SHOW_FLAG(LEFT_JUSTIFIED);
57af1315c2SSiva Chandra Reddy     IF_FLAG_SHOW_FLAG(FORCE_SIGN);
58af1315c2SSiva Chandra Reddy     IF_FLAG_SHOW_FLAG(SPACE_PREFIX);
59af1315c2SSiva Chandra Reddy     IF_FLAG_SHOW_FLAG(ALTERNATE_FORM);
60af1315c2SSiva Chandra Reddy     IF_FLAG_SHOW_FLAG(LEADING_ZEROES);
61dcf296b5SSiva Chandra Reddy     tlog << "\n";
62dcf296b5SSiva Chandra Reddy     tlog << "\tmin width: " << form.min_width << "\n";
63dcf296b5SSiva Chandra Reddy     tlog << "\tprecision: " << form.precision << "\n";
64dcf296b5SSiva Chandra Reddy     tlog << "\tlength modifier: ";
65af1315c2SSiva Chandra Reddy     switch (form.length_modifier) {
66af1315c2SSiva Chandra Reddy       CASE_LM(none);
67af1315c2SSiva Chandra Reddy       CASE_LM(l);
68af1315c2SSiva Chandra Reddy       CASE_LM(ll);
69af1315c2SSiva Chandra Reddy       CASE_LM(h);
70af1315c2SSiva Chandra Reddy       CASE_LM(hh);
71af1315c2SSiva Chandra Reddy       CASE_LM(j);
72af1315c2SSiva Chandra Reddy       CASE_LM(z);
73af1315c2SSiva Chandra Reddy       CASE_LM(t);
74af1315c2SSiva Chandra Reddy       CASE_LM(L);
75fdef5c4fSOm Prakaash       CASE_LM_BIT_WIDTH(w, form.bit_width);
76fdef5c4fSOm Prakaash       CASE_LM_BIT_WIDTH(wf, form.bit_width);
77af1315c2SSiva Chandra Reddy     }
78dcf296b5SSiva Chandra Reddy     tlog << "\n";
79dcf296b5SSiva Chandra Reddy     tlog << "\tconversion name: " << form.conv_name << "\n";
80af1315c2SSiva Chandra Reddy     if (form.conv_name == 'p' || form.conv_name == 'n' || form.conv_name == 's')
81dcf296b5SSiva Chandra Reddy       tlog << "\tpointer value: "
82af1315c2SSiva Chandra Reddy            << int_to_hex<uintptr_t>(
83af1315c2SSiva Chandra Reddy                   reinterpret_cast<uintptr_t>(form.conv_val_ptr))
84af1315c2SSiva Chandra Reddy            << "\n";
85af1315c2SSiva Chandra Reddy     else if (form.conv_name != '%')
86dcf296b5SSiva Chandra Reddy       tlog << "\tvalue: "
873546f4daSGuillaume Chatelet            << int_to_hex<fputil::FPBits<long double>::StorageType>(
88af1315c2SSiva Chandra Reddy                   form.conv_val_raw)
89af1315c2SSiva Chandra Reddy            << "\n";
90af1315c2SSiva Chandra Reddy   }
91af1315c2SSiva Chandra Reddy }
92af1315c2SSiva Chandra Reddy } // anonymous namespace
93af1315c2SSiva Chandra Reddy 
94dcf296b5SSiva Chandra Reddy void FormatSectionMatcher::explainError() {
95dcf296b5SSiva Chandra Reddy   tlog << "expected format section: ";
96dcf296b5SSiva Chandra Reddy   display(expected);
97dcf296b5SSiva Chandra Reddy   tlog << '\n';
98dcf296b5SSiva Chandra Reddy   tlog << "actual format section  : ";
99dcf296b5SSiva Chandra Reddy   display(actual);
100dcf296b5SSiva Chandra Reddy   tlog << '\n';
101af1315c2SSiva Chandra Reddy }
102af1315c2SSiva Chandra Reddy 
103af1315c2SSiva Chandra Reddy } // namespace testing
104*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL
105