Browse Source

more test improvements

cl-refactor
arkpar 10 years ago
parent
commit
5c31f4cfc4
  1. 8
      mix/qml/StateDialog.qml
  2. 39
      mix/qml/TransactionDialog.qml
  3. 6
      mix/qml/WebCodeEditor.qml
  4. 98
      mix/test/TestService.cpp
  5. 15
      mix/test/TestService.h
  6. 62
      mix/test/qml/TestMain.qml

8
mix/qml/StateDialog.qml

@ -58,6 +58,11 @@ Window {
forceActiveFocus();
}
function acceptAndClose() {
close();
accepted();
}
function close() {
visible = false;
}
@ -298,8 +303,7 @@ Window {
Button {
text: qsTr("OK");
onClicked: {
close();
accepted();
acceptAndClose();
}
}
Button {

39
mix/qml/TransactionDialog.qml

@ -59,16 +59,7 @@ Window {
contractComboBox.currentIndex = contractIndex;
loadFunctions(contractComboBox.currentValue());
var functionIndex = -1;
for (var f = 0; f < functionsModel.count; f++)
if (functionsModel.get(f).text === item.functionId)
functionIndex = f;
if (functionIndex == -1 && functionsModel.count > 0)
functionIndex = 0; //@todo suggest unused function
functionComboBox.currentIndex = functionIndex;
selectFunction(functionId);
paramsModel = [];
if (functionId !== contractComboBox.currentValue())
@ -87,9 +78,6 @@ Window {
visible = true;
valueField.focus = true;
modalTransactionDialog.height = (paramsModel.length > 0 ? 500 : 300);
paramLabel.visible = paramsModel.length > 0;
paramScroll.visible = paramsModel.length > 0;
}
function loadFunctions(contractId)
@ -107,6 +95,19 @@ Window {
}
function selectFunction(functionId)
{
var functionIndex = -1;
for (var f = 0; f < functionsModel.count; f++)
if (functionsModel.get(f).text === functionId)
functionIndex = f;
if (functionIndex == -1 && functionsModel.count > 0)
functionIndex = 0; //@todo suggest unused function
functionComboBox.currentIndex = functionIndex;
}
function loadParameter(parameter)
{
var type = parameter.type;
@ -136,6 +137,15 @@ Window {
typeLoader.members = []
typeLoader.value = paramValues;
typeLoader.members = paramsModel;
paramLabel.visible = paramsModel.length > 0;
paramScroll.visible = paramsModel.length > 0;
modalTransactionDialog.height = (paramsModel.length > 0 ? 500 : 300);
}
function acceptAndClose()
{
close();
accepted();
}
function close()
@ -369,8 +379,7 @@ Window {
Button {
text: qsTr("OK");
onClicked: {
close();
accepted();
acceptAndClose();
}
}
Button {

6
mix/qml/WebCodeEditor.qml

@ -4,6 +4,7 @@ import QtQuick.Layouts 1.0
import QtQuick.Controls.Styles 1.1
import QtWebEngine 1.0
import QtWebEngine.experimental 1.0
import org.ethereum.qml.Clipboard 1.0
import "js/ErrorLocationFormater.js" as ErrorLocationFormater
Item {
@ -68,6 +69,11 @@ Item {
editorBrowser.runJavaScript("changeGeneration()", function(result) {});
}
Clipboard
{
id: clipboard
}
Connections {
target: clipboard
onClipboardChanged: syncClipboard()

98
mix/test/TestService.cpp

@ -33,6 +33,56 @@ namespace dev
namespace mix
{
enum MouseAction { MousePress, MouseRelease, MouseClick, MouseDoubleClick, MouseMove };
static void mouseEvent(MouseAction _action, QWindow* _window, QObject* _item, Qt::MouseButton _button, Qt::KeyboardModifiers _stateKey, QPointF _pos, int _delay=-1)
{
if (_delay == -1 || _delay < 30)
_delay = 30;
if (_delay > 0)
QTest::qWait(_delay);
if (_action == MouseClick) {
mouseEvent(MousePress, _window, _item, _button, _stateKey, _pos);
mouseEvent(MouseRelease, _window, _item, _button, _stateKey, _pos);
return;
}
QPoint pos = _pos.toPoint();
QQuickItem *sgitem = qobject_cast<QQuickItem *>(_item);
if (sgitem)
pos = sgitem->mapToScene(_pos).toPoint();
_stateKey &= static_cast<unsigned int>(Qt::KeyboardModifierMask);
QMouseEvent me(QEvent::User, QPoint(), Qt::LeftButton, _button, _stateKey);
switch (_action)
{
case MousePress:
me = QMouseEvent(QEvent::MouseButtonPress, pos, _window->mapToGlobal(pos), _button, _button, _stateKey);
break;
case MouseRelease:
me = QMouseEvent(QEvent::MouseButtonRelease, pos, _window->mapToGlobal(pos), _button, 0, _stateKey);
break;
case MouseDoubleClick:
me = QMouseEvent(QEvent::MouseButtonDblClick, pos, _window->mapToGlobal(pos), _button, _button, _stateKey);
break;
case MouseMove:
// with move event the _button is NoButton, but 'buttons' holds the currently pressed buttons
me = QMouseEvent(QEvent::MouseMove, pos, _window->mapToGlobal(pos), Qt::NoButton, _button, _stateKey);
break;
default:
break;
}
QSpontaneKeyEvent::setSpontaneous(&me);
if (!qApp->notify(_window, &me)) {
static const char *mouseActionNames[] =
{ "MousePress", "MouseRelease", "MouseClick", "MouseDoubleClick", "MouseMove" };
QString warning = QString::fromLatin1("Mouse event \"%1\" not accepted by receiving window");
QWARN(warning.arg(QString::fromLatin1(mouseActionNames[static_cast<int>(_action)])).toLatin1().data());
}
}
bool TestService::waitForSignal(QObject* _item, QString _signalName, int _timeout)
{
QSignalSpy spy(_item, ("2" + _signalName.toStdString()).c_str());
@ -61,51 +111,57 @@ bool TestService::waitForSignal(QObject* _item, QString _signalName, int _timeou
return spy.size();
}
bool TestService::keyPress(int _key, int _modifiers, int _delay)
bool TestService::keyPress(QObject* _item, int _key, int _modifiers, int _delay)
{
QWindow *window = eventWindow();
QWindow *window = eventWindow(_item);
QTest::keyPress(window, Qt::Key(_key), Qt::KeyboardModifiers(_modifiers), _delay);
return true;
}
bool TestService::keyRelease(int _key, int _modifiers, int _delay)
bool TestService::keyRelease(QObject* _item, int _key, int _modifiers, int _delay)
{
QWindow *window = eventWindow();
QWindow *window = eventWindow(_item);
QTest::keyRelease(window, Qt::Key(_key), Qt::KeyboardModifiers(_modifiers), _delay);
return true;
}
bool TestService::keyClick(int _key, int _modifiers, int _delay)
bool TestService::keyClick(QObject* _item, int _key, int _modifiers, int _delay)
{
QWindow *window = eventWindow();
QWindow *window = eventWindow(_item);
QTest::keyClick(window, Qt::Key(_key), Qt::KeyboardModifiers(_modifiers), _delay);
return true;
}
bool TestService::keyPressChar(QString const& _character, int _modifiers, int _delay)
bool TestService::keyPressChar(QObject* _item, QString const& _character, int _modifiers, int _delay)
{
QTEST_ASSERT(_character.length() == 1);
QWindow *window = eventWindow();
QWindow *window = eventWindow(_item);
QTest::keyPress(window, _character[0].toLatin1(), Qt::KeyboardModifiers(_modifiers), _delay);
return true;
}
bool TestService::keyReleaseChar(QString const& _character, int _modifiers, int _delay)
bool TestService::keyReleaseChar(QObject* _item, QString const& _character, int _modifiers, int _delay)
{
QTEST_ASSERT(_character.length() == 1);
QWindow *window = eventWindow();
QWindow *window = eventWindow(_item);
QTest::keyRelease(window, _character[0].toLatin1(), Qt::KeyboardModifiers(_modifiers), _delay);
return true;
}
bool TestService::keyClickChar(QString const& _character, int _modifiers, int _delay)
bool TestService::keyClickChar(QObject* _item, QString const& _character, int _modifiers, int _delay)
{
QTEST_ASSERT(_character.length() == 1);
QWindow *window = eventWindow();
QWindow *window = eventWindow(_item);
QTest::keyClick(window, _character[0].toLatin1(), Qt::KeyboardModifiers(_modifiers), _delay);
return true;
}
bool TestService::mouseClick(QObject* _item, qreal _x, qreal _y, int _button, int _modifiers, int _delay)
{
QWindow* window = qobject_cast<QWindow*>(_item);
if (!window)
window = eventWindow(_item);
mouseEvent(MouseClick, window, _item, Qt::MouseButton(_button), Qt::KeyboardModifiers(_modifiers), QPointF(_x, _y), _delay);
return true;
}
void TestService::setTargetWindow(QObject* _window)
{
QQuickWindow* window = qobject_cast<QQuickWindow*>(_window);
@ -114,15 +170,21 @@ void TestService::setTargetWindow(QObject* _window)
window->requestActivate();
}
QWindow* TestService::eventWindow()
QWindow* TestService::eventWindow(QObject* _item)
{
QQuickWindow* window = qobject_cast<QQuickWindow*>(m_targetWindow);
QQuickItem* item = qobject_cast<QQuickItem *>(_item);
if (item && item->window())
return item->window();
QQuickWindow* window = qobject_cast<QQuickWindow*>(_item);
if (!window)
window = qobject_cast<QQuickWindow*>(m_targetWindow);
if (window)
{
window->requestActivate();
return window;
}
QQuickItem* item = qobject_cast<QQuickItem*>(m_targetWindow);
item = qobject_cast<QQuickItem*>(m_targetWindow);
if (item)
return item->window();
return 0;

15
mix/test/TestService.h

@ -42,15 +42,16 @@ public:
public slots:
bool waitForSignal(QObject* _item, QString _signalName, int _timeout);
bool keyPress(int _key, int _modifiers, int _delay);
bool keyRelease(int _key, int _modifiers, int _delay);
bool keyClick(int _key, int _modifiers, int _delay);
bool keyPressChar(QString const& _character, int _modifiers, int _delay);
bool keyReleaseChar(QString const& _character, int _modifiers, int _delay);
bool keyClickChar(QString const& _character, int _modifiers, int _delay);
bool keyPress(QObject* _item, int _key, int _modifiers, int _delay);
bool keyRelease(QObject* _item, int _key, int _modifiers, int _delay);
bool keyClick(QObject* _item, int _key, int _modifiers, int _delay);
bool keyPressChar(QObject* _item, QString const& _character, int _modifiers, int _delay);
bool keyReleaseChar(QObject* _item, QString const& _character, int _modifiers, int _delay);
bool keyClickChar(QObject* _item, QString const& _character, int _modifiers, int _delay);
bool mouseClick(QObject* _item, qreal _x, qreal _y, int _button, int _modifiers, int _delay);
private:
QWindow* eventWindow();
QWindow* eventWindow(QObject* _item);
QObject* m_targetWindow;
};

62
mix/test/qml/TestMain.qml

@ -10,12 +10,15 @@ TestCase
{
id: ts
targetWindow: mainApplication
function typeString(str)
function typeString(str, el)
{
if (el === undefined)
el = mainApplication;
for (var c in str)
{
ts.keyPressChar(str[c], Qt.NoModifier, 0);
ts.keyReleaseChar(str[c], Qt.NoModifier, 0);
ts.keyPressChar(el, str[c], Qt.NoModifier, 0);
ts.keyReleaseChar(el, str[c], Qt.NoModifier, 0);
}
}
}
@ -25,24 +28,24 @@ TestCase
waitForRendering(mainApplication.mainContent, 10000);
mainApplication.projectModel.createProject();
var projectDlg = mainApplication.projectModel.newProjectDialog;
wait(30);
projectDlg.projectTitle = "TestProject";
projectDlg.pathFieldText = "/tmp/MixTest"; //TODO: get platform temp path
projectDlg.acceptAndClose();
ts.waitForSignal(mainApplication.mainContent.codeEditor, "loadComplete()", 5000)
wait(300);
wait(30);
}
function editContract(c)
{
mainApplication.mainContent.codeEditor.getEditor("contract.sol").setText(c);
ts.keyPressChar("S", Qt.ControlModifier, 200); //Ctrl+S
ts.keyPressChar(mainApplication, "S", Qt.ControlModifier, 200); //Ctrl+S
if (!ts.waitForSignal(mainApplication.codeModel, "compilationComplete()", 5000))
fail("not compiled");
}
function clickElemet(el)
function clickElement(el, x, y)
{
mouseClick(el, 0, 0, Qt.LeftButton, Qt.NoModifier, 10)
ts.mouseClick(el, x, y, Qt.LeftButton, Qt.NoModifier, 10)
}
function test_defaultTransactionSequence()
@ -61,6 +64,8 @@ TestCase
" uint z;\r" +
"}\r"
);
if (!ts.waitForSignal(mainApplication.clientModel, "runComplete()", 5000))
fail("not run");
tryCompare(mainApplication.mainContent.rightPane.transactionLog.transactionModel, "count", 3);
}
@ -69,7 +74,7 @@ TestCase
newProject();
editContract(
"contract Contract {\r" +
" function Contract(uint256 x) {\r" +
" function setZ(uint256 x) {\r" +
" z = x;\r" +
" }\r" +
" function getZ() returns(uint256) {\r" +
@ -79,8 +84,22 @@ TestCase
"}\r"
);
mainApplication.projectModel.stateListModel.editState(0);
mainApplication.projectModel.stateDialog.model.editTransaction(2);
//TODO: edit transaction params and check results
mainApplication.projectModel.stateDialog.model.addTransaction();
var transactionDialog = mainApplication.projectModel.stateDialog.transactionDialog;
transactionDialog.selectFunction("setZ");
clickElement(transactionDialog, 140, 300);
ts.typeString("442", transactionDialog);
transactionDialog.acceptAndClose();
mainApplication.projectModel.stateDialog.model.addTransaction();
transactionDialog.selectFunction("getZ");
transactionDialog.acceptAndClose();
mainApplication.projectModel.stateDialog.acceptAndClose();
mainApplication.mainContent.startQuickDebugging();
wait(1);
if (!ts.waitForSignal(mainApplication.clientModel, "runComplete()", 5000))
fail("not run");
tryCompare(mainApplication.mainContent.rightPane.transactionLog.transactionModel, "count", 5);
tryCompare(mainApplication.mainContent.rightPane.transactionLog.transactionModel.get(4), "returned", "(442)");
}
function test_constructorParameters()
@ -88,7 +107,7 @@ TestCase
newProject();
editContract(
"contract Contract {\r" +
" function setZ(uint256 x) {\r" +
" function Contract(uint256 x) {\r" +
" z = x;\r" +
" }\r" +
" function getZ() returns(uint256) {\r" +
@ -98,12 +117,21 @@ TestCase
"}\r"
);
mainApplication.projectModel.stateListModel.editState(0);
mainApplication.projectModel.stateDialog.model.addTransaction();
mainApplication.projectModel.stateDialog.model.editTransaction(2);
var transactionDialog = mainApplication.projectModel.stateDialog.transactionDialog;
transactionDialog.functionId = "setZ";
//TODO: edit transaction params and check results
clickElement(transactionDialog, 140, 300);
ts.typeString("442", transactionDialog);
transactionDialog.acceptAndClose();
mainApplication.projectModel.stateDialog.model.addTransaction();
transactionDialog.selectFunction("getZ");
transactionDialog.acceptAndClose();
mainApplication.projectModel.stateDialog.acceptAndClose();
wait(1);
mainApplication.mainContent.startQuickDebugging();
if (!ts.waitForSignal(mainApplication.clientModel, "runComplete()", 5000))
fail("not run");
tryCompare(mainApplication.mainContent.rightPane.transactionLog.transactionModel, "count", 4);
tryCompare(mainApplication.mainContent.rightPane.transactionLog.transactionModel.get(3), "returned", "(442)");
}
Application

Loading…
Cancel
Save