15 #ifndef INCG_IRIS_IUTEST_CONSOLE_HPP_DCAC5025_B7BB_424E_A849_9E6FE0A3B460_
16 #define INCG_IRIS_IUTEST_CONSOLE_HPP_DCAC5025_B7BB_424E_A849_9E6FE0A3B460_
29 #ifndef IUTEST_VPRINTF
30 # define IUTEST_VPRINTF(f, a) vprintf(f, a)
33 #ifndef IUTEST_HAS_COLORCONSOLE
34 # if defined(IUTEST_OS_WINDOWS_MOBILE) || defined(IUTEST_OS_NACL)
35 # define IUTEST_HAS_COLORCONSOLE 0
37 # define IUTEST_HAS_COLORCONSOLE 1
51 virtual void output(
const char* fmt, ...) IUTEST_ATTRIBUTE_FORMAT_PRINTF(2, 3)
58 virtual void voutput(
const char* fmt, va_list va) = 0;
84 static inline void output(
const char *fmt, ...) IUTEST_ATTRIBUTE_FORMAT_PRINTF(1, 2);
89 static inline
void voutput(const
char* fmt, va_list va) IUTEST_ATTRIBUTE_FORMAT_PRINTF(1, 0);
95 static inline
void color_output(Color color, const
char *fmt, ...) IUTEST_ATTRIBUTE_FORMAT_PRINTF(2, 3);
102 static inline
void nl_output(const
char *fmt, ...) IUTEST_ATTRIBUTE_FORMAT_PRINTF(1, 2);
108 static inline
void nl_voutput(const
char* fmt, va_list va) IUTEST_ATTRIBUTE_FORMAT_PRINTF(1, 0);
112 static iuLogger* SetLogger(iuLogger* logger)
114 iuLogger* pre = GetLoggerInstanceVariable().pInstance;
115 GetLoggerInstanceVariable().pInstance = logger;
124 static bool IsColorModeOff()
126 #if defined(INCG_IRIS_IUTEST_HPP_) && !defined(IUTEST_USE_GTEST)
136 static bool IsColorModeOn()
138 #if defined(INCG_IRIS_IUTEST_HPP_) && !defined(IUTEST_USE_GTEST)
148 static bool IsColorModeAnsi()
150 #if defined(INCG_IRIS_IUTEST_HPP_) && !defined(IUTEST_USE_GTEST)
158 static inline void color_output_impl(Color color,
const char* fmt, va_list va) IUTEST_ATTRIBUTE_FORMAT_PRINTF(2, 0);
159 static inline bool IsShouldUseColor(
bool use_color);
160 static inline bool HasColorConsole();
161 static inline bool IsStringEqual(
const char* str1,
const char* str2) {
return strcmp(str1, str2) == 0; }
164 struct LoggerInstanceVariable
169 static LoggerInstanceVariable& GetLoggerInstanceVariable() {
static LoggerInstanceVariable sLogger;
return sLogger; }
170 static iuLogger* GetLogger() {
return GetLoggerInstanceVariable().pInstance; }
173 inline void iuConsole::output(
const char *fmt, ...)
180 inline void iuConsole::voutput(
const char* fmt, va_list va)
182 iuLogger* pLogger = GetLogger();
185 pLogger->voutput(fmt, va);
192 inline void iuConsole::color_output(Color color,
const char *fmt, ...)
197 if( IsShouldUseColor(
true) )
199 color_output_impl(color, fmt, va);
208 inline void iuConsole::nl_output(
const char *fmt, ...)
215 inline void iuConsole::nl_voutput(
const char* fmt, va_list va)
220 inline void iuConsole::color_output_impl(Color color,
const char* fmt, va_list va)
224 #if defined(IUTEST_OS_WINDOWS) && !defined(IUTEST_OS_WINDOWS_MOBILE) \
225 && !defined(IUTEST_OS_WINDOWS_PHONE) && !defined(IUTEST_OS_WINDOWS_RT)
226 if( !IsColorModeAnsi() )
228 const WORD attr[] = {
232 FOREGROUND_GREEN | FOREGROUND_RED,
234 FOREGROUND_RED | FOREGROUND_BLUE,
235 FOREGROUND_GREEN | FOREGROUND_BLUE,
236 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
238 const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
239 if( stdout_handle != INVALID_HANDLE_VALUE )
241 CONSOLE_SCREEN_BUFFER_INFO csbi;
242 if( ::GetConsoleScreenBufferInfo(stdout_handle, &csbi) )
244 const WORD wAttributes = csbi.wAttributes;
247 ::SetConsoleTextAttribute(stdout_handle, attr[color] | FOREGROUND_INTENSITY);
252 ::SetConsoleTextAttribute(stdout_handle, wAttributes);
259 output(
"\033[1;3%cm",
'0' + color);
265 inline bool iuConsole::IsShouldUseColor(
bool use_color)
267 if( IsColorModeOn() )
271 else if( IsColorModeOff() )
275 static bool has_color = HasColorConsole();
276 return use_color && has_color;
279 inline bool iuConsole::HasColorConsole()
281 #if !IUTEST_HAS_COLORCONSOLE
284 #if defined(IUTEST_OS_WINDOWS)
286 CONSOLE_SCREEN_BUFFER_INFO csbi;
287 if( ::GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi) )
293 const char* env = internal::posix::GetEnv(
"TERM");
294 const bool term_conf = (env != NULL) && (
295 IsStringEqual(env,
"xterm")
296 || IsStringEqual(env,
"xterm-color")
297 || IsStringEqual(env,
"xterm-256color")
298 || IsStringEqual(env,
"screen")
299 || IsStringEqual(env,
"screen-256color")
300 || IsStringEqual(env,
"tmux")
301 || IsStringEqual(env,
"tmux-256color")
302 || IsStringEqual(env,
"rxvt-unicode")
303 || IsStringEqual(env,
"rxvt-unicode-256color")
304 || IsStringEqual(env,
"linux")
305 || IsStringEqual(env,
"cygwin")
314 #endif // INCG_IRIS_IUTEST_CONSOLE_HPP_DCAC5025_B7BB_424E_A849_9E6FE0A3B460_