From c191ab9c7a80f5374d2594ab5c76477610fa728b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20W=C3=A4ckerlin?= Date: Wed, 20 May 2015 11:52:14 +0000 Subject: [PATCH] improved logging, bugfix in function handling --- src/commands.hxx | 209 +++++++++++++++++++++++++++------------------ src/exceptions.hxx | 8 +- src/testgui.hxx | 8 +- src/webrunner.cxx | 2 +- 4 files changed, 136 insertions(+), 91 deletions(-) diff --git a/src/commands.hxx b/src/commands.hxx index 4f2f20e..e092852 100644 --- a/src/commands.hxx +++ b/src/commands.hxx @@ -93,7 +93,7 @@ class Command: public QObject { virtual QString description() const = 0; virtual QString command() const = 0; virtual std::shared_ptr parse(Script*, QString, - QStringList&, int) = 0; + QStringList&, QString, int) = 0; virtual bool execute(Script*, QWebFrame*) = 0; void line(int linenr) { _line = linenr; @@ -101,6 +101,12 @@ class Command: public QObject { int line() const { return _line; } + void file(QString filename) { + _file = filename; + } + QString file() const { + return _file; + } bool log() { return _log; } @@ -170,10 +176,12 @@ class Command: public QObject { case '"': case '\'': { return value.mid(1, value.size()-2) .split(QRegularExpression(QString(value[0])+", *" - +QString(value[0]))); + +QString(value[0])), + QString::SkipEmptyParts); } break; default: { - return value.split(QRegularExpression(", *")); + return value.split(QRegularExpression(", *"), + QString::SkipEmptyParts); } } } @@ -210,6 +218,7 @@ class Command: public QObject { QString _result; private: int _line; + QString _file; }; class Empty: public Command { @@ -226,7 +235,8 @@ class Empty: public Command { QString command() const { return tag(); } - std::shared_ptr parse(Script*, QString, QStringList&, int) { + std::shared_ptr parse(Script*, QString, + QStringList&, QString, int) { std::shared_ptr cmd(new Empty()); return cmd; } @@ -237,7 +247,7 @@ class Empty: public Command { class Comment: public Command { public: - Comment(QString line): _line(line) {} + Comment(QString comment): _comment(comment) {} QString tag() const { return "#"; } @@ -248,9 +258,10 @@ class Comment: public Command { "Comments are lines that start with #"; } QString command() const { - return _line; + return _comment; } - std::shared_ptr parse(Script*, QString args, QStringList&, int) { + std::shared_ptr parse(Script*, QString args, + QStringList&, QString, int) { std::shared_ptr cmd(new Comment(args)); return cmd; } @@ -259,7 +270,7 @@ class Comment: public Command { return true; } private: - QString _line; + QString _comment; }; class Screenshot: public Command { @@ -321,7 +332,8 @@ class Screenshot: public Command { QString command() const { return tag()+" "+_filename; } - std::shared_ptr parse(Script*, QString args, QStringList&, int) { + std::shared_ptr parse(Script*, QString args, + QStringList&, QString, int) { std::shared_ptr cmd(new Screenshot()); cmd->_filename = args; return cmd; @@ -399,6 +411,12 @@ class Script: public QObject { } }; public: + Script(const Script& o): + QObject(), + _prototypes(o._prototypes), + _script(o._script) { + set(o); + } static QString xmlattr(QString attr, bool br = false) { attr.replace("&", "&")//.replace(" ", " ") .replace("\"", """); @@ -475,7 +493,9 @@ class Script: public QObject { _timeout = 20; _clicktype = JAVASCRIPT_CLICK; } - std::shared_ptr parse(QStringList& in, int linenr) try { + std::shared_ptr parseLine(QStringList& in, + QString filename, int linenr) try { + std::shared_ptr command; QString line(in.takeFirst().trimmed()); QString cmd(line), args; int space(line.indexOf(' ')); @@ -485,22 +505,23 @@ class Script: public QObject { } Prototypes::const_iterator it(_prototypes.find(cmd)); if (it!=_prototypes.end()) { - std::shared_ptr command(it->second->parse - (this, args, in, linenr)); - command->line(linenr); - return command; + command = it->second->parse(this, args, in, filename, linenr); } else { - return unknown(line); + command = unknown(line); } + command->file(filename); + command->line(linenr); + return command; } catch (Exception& e) { e.line(linenr); + e.file(filename); throw; } - void parse(QStringList in) { - for (int linenr(1), oldsize(0); + void parse(QStringList in, QString filename, int line = 1) { + for (int linenr(0), oldsize(0); oldsize=in.size(), in.size(); linenr+=oldsize-in.size()) - _script.push_back(parse(in, linenr)); + _script.push_back(parseLine(in, filename, line+linenr)); } QStringList print() { QStringList result; @@ -628,6 +649,7 @@ class Script: public QObject { _testsuites->last()<line()); + e.file((*cmd)->file()); if (screenshots) try { // write html source and take a last screenshot on error { @@ -721,7 +743,7 @@ class Script: public QObject { _cout.clear(); _cerr.clear(); _ignoreSignalsUntil.clear(); - _functions.clear(); + _functions.unite(o._functions); } void unset(QString name) { _rvariables.remove(_variables[name]); @@ -824,11 +846,17 @@ class Script: public QObject { std::cout< unknown(QString line) { - if (!line.size()) return std::shared_ptr(new Empty()); - if (line[0]=='#') return std::shared_ptr(new Comment(line)); - throw UnknownCommand(line); // error + std::shared_ptr unknown(QString command) { + if (!command.size()) + return std::shared_ptr(new Empty()); + if (command[0]=='#') + return std::shared_ptr(new Comment(command)); + throw UnknownCommand(command); // error } void initPrototypes(); void add(Command* c) { @@ -851,9 +879,7 @@ class Script: public QObject { return; } _ignoreSignalsUntil.clear(); - log(".... signal"); - log("received loadFinished "+QString(ok?"true":"false")); - log("....................."); + log("signal received: loadFinished "+QString(ok?"true":"false")); _signals.push(std::make_pair("loadFinished", QStringList(sig))); } void loadStarted() { @@ -862,9 +888,7 @@ class Script: public QObject { return; } _ignoreSignalsUntil.clear(); - log(".... signal"); - log("received loadStarted"); - log("....................."); + log("signal received: loadStarted"); _signals.push(std::make_pair("loadStarted", QStringList())); } void frameChanged() { @@ -878,9 +902,7 @@ class Script: public QObject { return; } _ignoreSignalsUntil.clear(); - log(".... signal"); - log("received urlChanged "+url.toString()); - log("....................."); + log("signal received: urlChanged "+url.toString()); _signals.push(std::make_pair("urlChanged", QStringList(url.toString()))); } @@ -929,7 +951,7 @@ class Do: public Command { return tag()+" "+_selector+_javascript; } std::shared_ptr parse(Script*, QString args, - QStringList& in, int) { + QStringList& in, QString, int) { std::shared_ptr cmd(new Do()); cmd->_selector = args.trimmed(); cmd->_javascript = subCommandBlock(in).join("\n"); @@ -966,7 +988,8 @@ class Load: public Command { QString command() const { return tag()+" "+_url; } - std::shared_ptr parse(Script*, QString args, QStringList&, int) { + std::shared_ptr parse(Script*, QString args, + QStringList&, QString, int) { std::shared_ptr cmd(new Load()); cmd->_url = args; return cmd; @@ -1009,7 +1032,8 @@ class Expect: public Command { return tag()+" "+_signal._signal +(_signal._args.size()?" "+_signal._args.join(' '):QString()); } - std::shared_ptr parse(Script*, QString args, QStringList&, int) { + std::shared_ptr parse(Script*, QString args, + QStringList&, QString, int) { std::shared_ptr cmd(new Expect()); cmd->_signal._args = args.split(" "); cmd->_signal._signal = cmd->_signal._args.takeFirst(); @@ -1064,7 +1088,8 @@ class Open: public Command { QString command() const { return tag(); } - std::shared_ptr parse(Script*, QString, QStringList&, int) { + std::shared_ptr parse(Script*, QString, + QStringList&, QString, int) { std::shared_ptr cmd(new Open()); return cmd; } @@ -1091,7 +1116,8 @@ class Sleep: public Command { QString command() const { return tag()+" "+_time; } - std::shared_ptr parse(Script*, QString time, QStringList&, int) { + std::shared_ptr parse(Script*, QString time, + QStringList&, QString, int) { std::shared_ptr cmd(new Sleep()); cmd->_time = "10"; // default: 10s if (time.size()) cmd->_time = time; @@ -1128,7 +1154,8 @@ class Exit: public Command { QString command() const { return tag(); } - std::shared_ptr parse(Script*, QString, QStringList&, int) { + std::shared_ptr parse(Script*, QString, + QStringList&, QString, int) { std::shared_ptr cmd(new Exit()); return cmd; } @@ -1155,7 +1182,8 @@ class IgnoreTo: public Command { QString command() const { return tag()+" "+_label; } - std::shared_ptr parse(Script*, QString args, QStringList&, int) { + std::shared_ptr parse(Script*, QString args, + QStringList&, QString, int) { std::shared_ptr cmd(new IgnoreTo()); if (!args.size()) throw BadArgument("ignoreto needs a label"); cmd->_label=args; @@ -1184,7 +1212,8 @@ class Label: public Command { QString command() const { return tag()+" "+_label; } - std::shared_ptr parse(Script*, QString args, QStringList&, int) { + std::shared_ptr parse(Script*, QString args, + QStringList&, QString, int) { std::shared_ptr