xref: /aosp_15_r20/external/fmtlib/test/util.h (revision 5c90c05cd622c0a81b57953a4d343e0e489f2e08)
1*5c90c05cSAndroid Build Coastguard Worker // Formatting library for C++ - test utilities
2*5c90c05cSAndroid Build Coastguard Worker //
3*5c90c05cSAndroid Build Coastguard Worker // Copyright (c) 2012 - present, Victor Zverovich
4*5c90c05cSAndroid Build Coastguard Worker // All rights reserved.
5*5c90c05cSAndroid Build Coastguard Worker //
6*5c90c05cSAndroid Build Coastguard Worker // For the license information refer to format.h.
7*5c90c05cSAndroid Build Coastguard Worker 
8*5c90c05cSAndroid Build Coastguard Worker #include <cstdarg>
9*5c90c05cSAndroid Build Coastguard Worker #include <cstdio>
10*5c90c05cSAndroid Build Coastguard Worker #include <locale>
11*5c90c05cSAndroid Build Coastguard Worker #include <string>
12*5c90c05cSAndroid Build Coastguard Worker 
13*5c90c05cSAndroid Build Coastguard Worker #include "fmt/os.h"
14*5c90c05cSAndroid Build Coastguard Worker 
15*5c90c05cSAndroid Build Coastguard Worker #ifdef _MSC_VER
16*5c90c05cSAndroid Build Coastguard Worker #  define FMT_VSNPRINTF vsprintf_s
17*5c90c05cSAndroid Build Coastguard Worker #else
18*5c90c05cSAndroid Build Coastguard Worker #  define FMT_VSNPRINTF vsnprintf
19*5c90c05cSAndroid Build Coastguard Worker #endif
20*5c90c05cSAndroid Build Coastguard Worker 
21*5c90c05cSAndroid Build Coastguard Worker template <size_t SIZE>
safe_sprintf(char (& buffer)[SIZE],const char * format,...)22*5c90c05cSAndroid Build Coastguard Worker void safe_sprintf(char (&buffer)[SIZE], const char* format, ...) {
23*5c90c05cSAndroid Build Coastguard Worker   std::va_list args;
24*5c90c05cSAndroid Build Coastguard Worker   va_start(args, format);
25*5c90c05cSAndroid Build Coastguard Worker   FMT_VSNPRINTF(buffer, SIZE, format, args);
26*5c90c05cSAndroid Build Coastguard Worker   va_end(args);
27*5c90c05cSAndroid Build Coastguard Worker }
28*5c90c05cSAndroid Build Coastguard Worker 
29*5c90c05cSAndroid Build Coastguard Worker extern const char* const file_content;
30*5c90c05cSAndroid Build Coastguard Worker 
31*5c90c05cSAndroid Build Coastguard Worker // Opens a buffered file for reading.
32*5c90c05cSAndroid Build Coastguard Worker auto open_buffered_file(FILE** fp = nullptr) -> fmt::buffered_file;
33*5c90c05cSAndroid Build Coastguard Worker 
34*5c90c05cSAndroid Build Coastguard Worker inline auto safe_fopen(const char* filename, const char* mode) -> FILE* {
35*5c90c05cSAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(__MINGW32__)
36*5c90c05cSAndroid Build Coastguard Worker   // Fix MSVC warning about "unsafe" fopen.
37*5c90c05cSAndroid Build Coastguard Worker   FILE* f = nullptr;
38*5c90c05cSAndroid Build Coastguard Worker   errno = fopen_s(&f, filename, mode);
39*5c90c05cSAndroid Build Coastguard Worker   return f;
40*5c90c05cSAndroid Build Coastguard Worker #else
41*5c90c05cSAndroid Build Coastguard Worker   return std::fopen(filename, mode);
42*5c90c05cSAndroid Build Coastguard Worker #endif
43*5c90c05cSAndroid Build Coastguard Worker }
44*5c90c05cSAndroid Build Coastguard Worker 
45*5c90c05cSAndroid Build Coastguard Worker template <typename Char> class basic_test_string {
46*5c90c05cSAndroid Build Coastguard Worker  private:
47*5c90c05cSAndroid Build Coastguard Worker   std::basic_string<Char> value_;
48*5c90c05cSAndroid Build Coastguard Worker 
49*5c90c05cSAndroid Build Coastguard Worker   static const Char empty[];
50*5c90c05cSAndroid Build Coastguard Worker 
51*5c90c05cSAndroid Build Coastguard Worker  public:
value_(value)52*5c90c05cSAndroid Build Coastguard Worker   explicit basic_test_string(const Char* value = empty) : value_(value) {}
53*5c90c05cSAndroid Build Coastguard Worker 
54*5c90c05cSAndroid Build Coastguard Worker   auto value() const -> const std::basic_string<Char>& { return value_; }
55*5c90c05cSAndroid Build Coastguard Worker };
56*5c90c05cSAndroid Build Coastguard Worker 
57*5c90c05cSAndroid Build Coastguard Worker template <typename Char> const Char basic_test_string<Char>::empty[] = {0};
58*5c90c05cSAndroid Build Coastguard Worker 
59*5c90c05cSAndroid Build Coastguard Worker using test_string = basic_test_string<char>;
60*5c90c05cSAndroid Build Coastguard Worker using test_wstring = basic_test_string<wchar_t>;
61*5c90c05cSAndroid Build Coastguard Worker 
62*5c90c05cSAndroid Build Coastguard Worker template <typename Char>
63*5c90c05cSAndroid Build Coastguard Worker auto operator<<(std::basic_ostream<Char>& os, const basic_test_string<Char>& s)
64*5c90c05cSAndroid Build Coastguard Worker     -> std::basic_ostream<Char>& {
65*5c90c05cSAndroid Build Coastguard Worker   os << s.value();
66*5c90c05cSAndroid Build Coastguard Worker   return os;
67*5c90c05cSAndroid Build Coastguard Worker }
68*5c90c05cSAndroid Build Coastguard Worker 
69*5c90c05cSAndroid Build Coastguard Worker class date {
70*5c90c05cSAndroid Build Coastguard Worker   int year_, month_, day_;
71*5c90c05cSAndroid Build Coastguard Worker 
72*5c90c05cSAndroid Build Coastguard Worker  public:
date(int year,int month,int day)73*5c90c05cSAndroid Build Coastguard Worker   date(int year, int month, int day) : year_(year), month_(month), day_(day) {}
74*5c90c05cSAndroid Build Coastguard Worker 
75*5c90c05cSAndroid Build Coastguard Worker   auto year() const -> int { return year_; }
76*5c90c05cSAndroid Build Coastguard Worker   auto month() const -> int { return month_; }
77*5c90c05cSAndroid Build Coastguard Worker   auto day() const -> int { return day_; }
78*5c90c05cSAndroid Build Coastguard Worker };
79*5c90c05cSAndroid Build Coastguard Worker 
80*5c90c05cSAndroid Build Coastguard Worker // Returns a locale with the given name if available or classic locale
81*5c90c05cSAndroid Build Coastguard Worker // otherwise.
82*5c90c05cSAndroid Build Coastguard Worker auto get_locale(const char* name, const char* alt_name = nullptr)
83*5c90c05cSAndroid Build Coastguard Worker     -> std::locale;
84