[ROSAUTOTEST]

Make outputting a string as easy as it should be. Now that our StringOut internally uses OutputDebugStringA instead of DbgPrint, we don't need to output in 512 byte chunks anymore.
Additionally, do an explicit flush when using std::cout to not lose debug output.

ROSTESTS-158 #resolve #comment Committed in r66855

svn path=/trunk/; revision=66855
This commit is contained in:
Colin Finck 2015-03-22 12:35:08 +00:00
parent d2bc21c312
commit 40da1525c9
3 changed files with 22 additions and 73 deletions

View file

@ -276,7 +276,6 @@ CWineTest::RunTest(CTestInfo* TestInfo)
stringstream ss, ssFinish;
DWORD StartTime;
float TotalTime;
string tailString;
CPipe Pipe;
char Buffer[1024];
@ -295,7 +294,7 @@ CWineTest::RunTest(CTestInfo* TestInfo)
{
/* Output text through StringOut, even while the test is still running */
Buffer[BytesAvailable] = 0;
tailString = StringOut(tailString.append(string(Buffer)), false);
StringOut(string(Buffer));
if(Configuration.DoSubmit())
TestInfo->Log += Buffer;
@ -305,17 +304,10 @@ CWineTest::RunTest(CTestInfo* TestInfo)
}
catch(CTestException& e)
{
if(!tailString.empty())
StringOut(tailString);
tailString.clear();
StringOut(e.GetMessage());
TestInfo->Log += e.GetMessage();
}
/* Print what's left */
if(!tailString.empty())
StringOut(tailString);
TotalTime = ((float)GetTickCount() - StartTime)/1000;
ssFinish << "Test " << TestInfo->Test << " completed in ";
ssFinish << setprecision(2) << fixed << TotalTime << " seconds." << endl;

View file

@ -69,7 +69,7 @@ string EscapeString(const char* Input);
string EscapeString(const string& Input);
string GetINIValue(PCWCH AppName, PCWCH KeyName, PCWCH FileName);
bool IsNumber(const char* Input);
string StringOut(const string& String, bool forcePrint = true);
void StringOut(const string& InputString);
string UnicodeToAscii(PCWSTR UnicodeString);
string UnicodeToAscii(const wstring& UnicodeString);

View file

@ -2,12 +2,11 @@
* PROJECT: ReactOS Automatic Testing Utility
* LICENSE: GNU GPLv2 or any later version as published by the Free Software Foundation
* PURPOSE: Various helper functions
* COPYRIGHT: Copyright 2008-2009 Colin Finck <colin@reactos.org>
* COPYRIGHT: Copyright 2008-2015 Colin Finck <colin@reactos.org>
*/
#include "precomp.h"
#define DBGPRINT_BUFSIZE 511
static const char HexCharacters[] = "0123456789ABCDEF";
/**
@ -87,85 +86,43 @@ IsNumber(const char* Input)
/**
* Outputs a string through the standard output and the debug output.
* The string may have LF or CRLF line endings.
* The input string may have LF or CRLF line endings.
*
* @param String
* @param InputString
* The std::string to output
*/
string
StringOut(const string& String, bool forcePrint)
void
StringOut(const string& InputString)
{
char DbgString[DBGPRINT_BUFSIZE + 1];
size_t i, start = 0, last_newline = 0, size = 0, curr_pos = 0;
string NewString;
const char* pInput = InputString.c_str();
char* OutputString = new char[InputString.size() + 1];
char* pOutput = OutputString;
/* Unify the line endings (the piped output of the tests may use CRLF) */
for(i = 0; i < String.size(); i++)
while (*pInput)
{
/* If this is a CRLF line-ending, only copy a \n to the new string and skip the next character */
if(String[i] == '\r' && String[i + 1] == '\n')
if (*pInput == '\r' && *(pInput + 1) == '\n')
{
NewString += '\n';
++i;
*pOutput = '\n';
++pInput;
}
else
{
/* Otherwise copy the string */
NewString += String[i];
*pOutput = *pInput;
}
curr_pos = NewString.size();
/* Try to print whole lines but obey the 512 bytes chunk size limit*/
if(NewString[curr_pos - 1] == '\n' || (curr_pos - start) == DBGPRINT_BUFSIZE)
{
if((curr_pos - start) >= DBGPRINT_BUFSIZE)
{
/* No newlines so far, or the string just fits */
if(last_newline <= start || ((curr_pos - start == DBGPRINT_BUFSIZE) && NewString[curr_pos - 1] == '\n'))
{
size = curr_pos - start;
memcpy(DbgString, NewString.c_str() + start, size);
start = curr_pos;
}
else
{
size = last_newline - start;
memcpy(DbgString, NewString.c_str() + start, size);
start = last_newline;
}
DbgString[size] = 0;
OutputDebugStringA(DbgString);
}
last_newline = curr_pos;
}
++pInput;
++pOutput;
}
size = curr_pos - start;
*pOutput = 0;
OutputDebugStringA(OutputString);
/* Only print if forced to or if the rest is a whole line */
if(forcePrint == true || NewString[curr_pos - 1] == '\n')
{
/* Output the whole string */
if(Configuration.DoPrint())
cout << NewString;
if (Configuration.DoPrint())
cout << OutputString << flush;
memcpy(DbgString, NewString.c_str() + start, size);
DbgString[size] = 0;
OutputDebugStringA(DbgString);
NewString.clear();
return NewString;
}
/* Output full lines only */
if(Configuration.DoPrint())
cout << NewString.substr(0, start);
/* Return the remaining chunk */
return NewString.substr(start, size);
delete[] OutputString;
}
/**