Resolve comments of @zappoman.

-- Rename "asserts" to "assert"
-- Log printing methods will accept lists of objects or strings.
This commit is contained in:
NeetBhagat 2017-06-17 00:42:29 +05:30
parent a6b1b17d45
commit 2909aa9ac8
4 changed files with 151 additions and 91 deletions

View file

@ -18,124 +18,165 @@
#include "ConsoleScriptingInterface.h"
#include "ScriptEngine.h"
#define INDENTATION 4
#define INDENTATION 4 // 1 Tab - 4 spaces
const QString LINE_SEPARATOR = "\n ";
const QString SPACE_SEPARATOR = " ";
const QString STACK_TRACE_FORMAT = "\n[Stacktrace]%1%2";
QList<QString> ConsoleScriptingInterface::_groupDetails = QList<QString>();
void ConsoleScriptingInterface::info(QString message) {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine())) {
scriptEngine->scriptInfoMessage(message);
QScriptValue ConsoleScriptingInterface::info(QScriptContext* context, QScriptEngine* engine) {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine)) {
scriptEngine->scriptInfoMessage(appendArguments(context));
}
return QScriptValue::NullValue;
}
void ConsoleScriptingInterface::log(QString message) {
QScriptValue ConsoleScriptingInterface::log(QScriptContext* context, QScriptEngine* engine) {
QString message = appendArguments(context);
if (_groupDetails.count() == 0) {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine())) {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine)) {
scriptEngine->scriptPrintedMessage(message);
}
} else {
this->logGroupMessage(message);
logGroupMessage(message, engine);
}
return QScriptValue::NullValue;
}
void ConsoleScriptingInterface::debug(QString message) {
QScriptValue ConsoleScriptingInterface::debug(QScriptContext* context, QScriptEngine* engine) {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine)) {
scriptEngine->scriptPrintedMessage(appendArguments(context));
}
return QScriptValue::NullValue;
}
QScriptValue ConsoleScriptingInterface::warn(QScriptContext* context, QScriptEngine* engine) {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine)) {
scriptEngine->scriptWarningMessage(appendArguments(context));
}
return QScriptValue::NullValue;
}
QScriptValue ConsoleScriptingInterface::error(QScriptContext* context, QScriptEngine* engine) {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine)) {
scriptEngine->scriptErrorMessage(appendArguments(context));
}
return QScriptValue::NullValue;
}
QScriptValue ConsoleScriptingInterface::exception(QScriptContext* context, QScriptEngine* engine) {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine)) {
scriptEngine->scriptErrorMessage(appendArguments(context));
}
return QScriptValue::NullValue;
}
void ConsoleScriptingInterface::time(QString labelName) {
_timerDetails.insert(labelName, QDateTime::currentDateTime().toUTC());
QString message = QString("%1: Timer started").arg(labelName);
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine())) {
scriptEngine->scriptPrintedMessage(message);
}
}
void ConsoleScriptingInterface::warn(QString message) {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine())) {
scriptEngine->scriptWarningMessage(message);
}
}
void ConsoleScriptingInterface::error(QString message) {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine())) {
scriptEngine->scriptErrorMessage(message);
}
}
void ConsoleScriptingInterface::exception(QString message) {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine())) {
scriptEngine->scriptErrorMessage(message);
}
}
void ConsoleScriptingInterface::time(QString labelName) {
_timerDetails.insert(labelName, QDateTime::currentDateTime().toUTC());
QString message = QString("%1: timer started").arg(labelName);
this->log(message);
}
void ConsoleScriptingInterface::timeEnd(QString labelName) {
if (!_timerDetails.contains(labelName)) {
this->error("No such label found " + labelName);
return;
}
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine())) {
if (!_timerDetails.contains(labelName)) {
scriptEngine->scriptErrorMessage("No such label found " + labelName);
return;
}
if (_timerDetails.value(labelName).isNull()) {
if (_timerDetails.value(labelName).isNull()) {
_timerDetails.remove(labelName);
scriptEngine->scriptErrorMessage("Invalid start time for " + labelName);
return;
}
QDateTime _startTime = _timerDetails.value(labelName);
QDateTime _endTime = QDateTime::currentDateTime().toUTC();
qint64 diffInMS = _startTime.msecsTo(_endTime);
QString message = QString("%1: %2ms").arg(labelName).arg(QString::number(diffInMS));
_timerDetails.remove(labelName);
this->error("Invalid start time for " + labelName);
return;
}
QDateTime _startTime = _timerDetails.value(labelName);
QDateTime _endTime = QDateTime::currentDateTime().toUTC();
qint64 diffInMS = _startTime.msecsTo(_endTime);
QString message = QString("%1: %2ms").arg(labelName).arg(QString::number(diffInMS));
_timerDetails.remove(labelName);
this->log(message);
scriptEngine->scriptPrintedMessage(message);
}
}
void ConsoleScriptingInterface::asserts(bool condition, QString message) {
QScriptValue ConsoleScriptingInterface::assertion(QScriptContext* context, QScriptEngine* engine) {
QString message;
bool condition = false;
for (int i = 0; i < context->argumentCount(); i++) {
if (i == 0) {
condition = context->argument(i).toBool(); // accept first value as condition
} else {
message += SPACE_SEPARATOR + context->argument(i).toString(); // accept other parameters as message
}
}
QString assertionResult;
if (!condition) {
QString assertionResult;
if (message.isEmpty()) {
assertionResult = "Assertion failed";
} else {
assertionResult = QString("Assertion failed : %1").arg(message);
}
this->error(assertionResult);
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine)) {
scriptEngine->scriptErrorMessage(assertionResult);
}
}
return QScriptValue::NullValue;
}
void ConsoleScriptingInterface::trace() {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine())) {
void ConsoleScriptingInterface::trace() {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine())) {
scriptEngine->scriptPrintedMessage
(QString(STACK_TRACE_FORMAT).arg(LINE_SEPARATOR,
scriptEngine->currentContext()->backtrace().join(LINE_SEPARATOR)));
}
}
void ConsoleScriptingInterface::clear() {
void ConsoleScriptingInterface::clear() {
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine())) {
scriptEngine->clearDebugLogWindow();
}
}
void ConsoleScriptingInterface::group(QString groupName) {
this->logGroupMessage(groupName);
_groupDetails.push_back(groupName);
QScriptValue ConsoleScriptingInterface::group(QScriptContext* context, QScriptEngine* engine) {
logGroupMessage(context->argument(0).toString(), engine); // accept first parameter as label
_groupDetails.push_back(context->argument(0).toString());
return QScriptValue::NullValue;
}
void ConsoleScriptingInterface::groupCollapsed(QString groupName) {
this->logGroupMessage(groupName);
_groupDetails.push_back(groupName);
QScriptValue ConsoleScriptingInterface::groupCollapsed(QScriptContext* context, QScriptEngine* engine) {
logGroupMessage(context->argument(0).toString(), engine); // accept first parameter as label
_groupDetails.push_back(context->argument(0).toString());
return QScriptValue::NullValue;
}
void ConsoleScriptingInterface::groupEnd() {
_groupDetails.removeLast();
QScriptValue ConsoleScriptingInterface::groupEnd(QScriptContext* context, QScriptEngine* engine) {
ConsoleScriptingInterface::_groupDetails.removeLast();
return QScriptValue::NullValue;
}
void ConsoleScriptingInterface::logGroupMessage(QString message) {
int _appendIndentation = _groupDetails.count() * INDENTATION;
QString ConsoleScriptingInterface::appendArguments(QScriptContext* context) {
QString message;
for (int i = 0; i < context->argumentCount(); i++) {
if (i > 0) {
message += SPACE_SEPARATOR;
}
message += context->argument(i).toString();
}
return message;
}
void ConsoleScriptingInterface::logGroupMessage(QString message, QScriptEngine* engine) {
int _addSpaces = _groupDetails.count() * INDENTATION;
QString logMessage;
for (int count = 0; count < _appendIndentation; count++) {
logMessage.append(" ");
for (int i = 0; i < _addSpaces; i++) {
logMessage.append(SPACE_SEPARATOR);
}
logMessage.append(message);
this->debug(logMessage);
if (ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(engine)) {
scriptEngine->scriptPrintedMessage(logMessage);
}
}

View file

@ -28,25 +28,29 @@
// Scriptable interface of "console" object. Used exclusively in the JavaScript API
class ConsoleScriptingInterface : public QObject, protected QScriptable {
Q_OBJECT
public:
static QScriptValue info(QScriptContext* context, QScriptEngine* engine);
static QScriptValue log(QScriptContext* context, QScriptEngine* engine);
static QScriptValue debug(QScriptContext* context, QScriptEngine* engine);
static QScriptValue warn(QScriptContext* context, QScriptEngine* engine);
static QScriptValue error(QScriptContext* context, QScriptEngine* engine);
static QScriptValue exception(QScriptContext* context, QScriptEngine* engine);
static QScriptValue assertion(QScriptContext* context, QScriptEngine* engine);
static QScriptValue group(QScriptContext* context, QScriptEngine* engine);
static QScriptValue groupCollapsed(QScriptContext* context, QScriptEngine* engine);
static QScriptValue groupEnd(QScriptContext* context, QScriptEngine* engine);
public slots:
void info(QString message);
void log(QString message);
void debug(QString message);
void warn(QString message);
void error(QString message);
void exception(QString message);
void time(QString labelName);
void timeEnd(QString labelName);
void asserts(bool condition, QString message = "");
void trace();
void clear();
void group(QString groupName);
void groupCollapsed(QString groupName);
void groupEnd();
private:
private:
QHash<QString, QDateTime> _timerDetails;
QList<QString> _groupDetails;
void logGroupMessage(QString msg);
static QList<QString> _groupDetails;
static void logGroupMessage(QString message, QScriptEngine* engine);
static QString appendArguments(QScriptContext* context);
};
#endif // hifi_ConsoleScriptingInterface_h

View file

@ -672,8 +672,18 @@ void ScriptEngine::init() {
registerGlobalObject("Mat4", &_mat4Library);
registerGlobalObject("Uuid", &_uuidLibrary);
registerGlobalObject("Messages", DependencyManager::get<MessagesClient>().data());
registerGlobalObject("console", &_consoleScriptingInterface);
registerGlobalObject("File", new FileScriptingInterface(this));
registerGlobalObject("console", &_consoleScriptingInterface);
registerFunction("console", "info", ConsoleScriptingInterface::info, currentContext()->argumentCount());
registerFunction("console", "log", ConsoleScriptingInterface::log, currentContext()->argumentCount());
registerFunction("console", "debug", ConsoleScriptingInterface::debug, currentContext()->argumentCount());
registerFunction("console", "warn", ConsoleScriptingInterface::warn, currentContext()->argumentCount());
registerFunction("console", "error", ConsoleScriptingInterface::error, currentContext()->argumentCount());
registerFunction("console", "exception", ConsoleScriptingInterface::exception, currentContext()->argumentCount());
registerFunction("console", "assert", ConsoleScriptingInterface::assertion, currentContext()->argumentCount());
registerFunction("console", "group", ConsoleScriptingInterface::group, 1);
registerFunction("console", "groupCollapsed", ConsoleScriptingInterface::groupCollapsed, 1);
registerFunction("console", "groupEnd", ConsoleScriptingInterface::groupEnd, 0);
qScriptRegisterMetaType(this, animVarMapToScriptValue, animVarMapFromScriptValue);
qScriptRegisterMetaType(this, resultHandlerToScriptValue, resultHandlerFromScriptValue);

View file

@ -17,6 +17,7 @@ function main() {
console.info(a = 2 * 6);
console.info(someValue);
console.info('someObject id ' + someObject.id);
console.info('Hello World ', 'someObject.id = ', someObject.id, "a = 2 * 6 = ", a = 2 * 6);
// console.log examples
console.log("[console.log] Hello World");
@ -25,6 +26,7 @@ function main() {
console.log(a = 2 * 6);
console.log(someValue);
console.log('someObject id ' + someObject.id);
console.log('Hello World ', 'someObject.id = ', someObject.id, "a = 2 * 6 = ", a = 2 * 6);
// console.debug examples
console.debug("[console.debug] Hello World.");
@ -33,6 +35,7 @@ function main() {
console.debug(a = 2 * 6);
console.debug(someValue);
console.debug('someObject id ' + someObject.id);
console.debug('Hello World ', 'someObject.id = ', someObject.id, "a = 2 * 6 = ", a = 2 * 6);
// console.warn examples
console.warn("[console.warn] This is warning message.");
@ -41,6 +44,7 @@ function main() {
console.warn(a = 2 * 6);
console.warn(someValue);
console.warn('someObject id ' + someObject.id);
console.warn('Hello World ', 'someObject.id = ', someObject.id, "a = 2 * 6 = ", a = 2 * 6);
// console.error examples
console.error('An error occurred!');
@ -64,15 +68,16 @@ function main() {
}
fooA();
//console.asserts() examples
// console.assert() examples
var valA = 1, valB = "1";
console.asserts(valA === valB, "Value A doesn't equal to B");
console.asserts(valA === valB);
console.asserts(5 === 5, "5 equals to 5");
console.asserts(5 === 5);
console.asserts(5 > 6, "5 is not greater than 6");
console.assert(valA === valB, "Value A doesn't equal to B");
console.assert(valA === valB);
console.assert(5 === 5, "5 equals to 5");
console.assert(5 === 5);
console.assert(5 > 6, "5 is not greater than 6");
console.assert(5 > 6, "5 is not greater than 6", "This assertion will fail");
//console.group() examples.
// console.group() examples.
console.group("Group 1");
console.log("Sentence 1");
console.log("Sentence 2");
@ -89,11 +94,11 @@ function main() {
console.groupEnd();
console.log("Sentence 9");
//console.time(),console.timeEnd() examples
console.time('Timer1');
// console.time(),console.timeEnd() examples
console.time('MyTimer');
// Do some process
sleep(1000);
console.timeEnd('Timer1');
console.timeEnd('MyTimer');
// use console.clear() to clean Debug Window logs
// console.clear();