Skip to content

Commit 7275525

Browse files
committed
[sextante] added tools to ease creating unit test for algorithms
1 parent 7c67101 commit 7275525

File tree

3 files changed

+114
-3
lines changed

3 files changed

+114
-3
lines changed

python/plugins/sextante/gui/HistoryDialog.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
* *
1717
***************************************************************************
1818
"""
19+
from sextante.gui import TestTools
1920

2021
__author__ = 'Victor Olaya'
2122
__date__ = 'August 2012'
@@ -25,11 +26,10 @@
2526

2627
from PyQt4.QtCore import *
2728
from PyQt4.QtGui import *
28-
2929
from sextante.core.SextanteLog import SextanteLog
30-
3130
from sextante.ui.ui_DlgHistory import Ui_DlgHistory
3231

32+
3333
class HistoryDialog(QDialog, Ui_DlgHistory):
3434
def __init__(self):
3535
QDialog.__init__(self)
@@ -48,9 +48,11 @@ def __init__(self):
4848
self.clearButton.setToolTip(self.tr("Clear history and log"))
4949
self.buttonBox.addButton(self.clearButton, QDialogButtonBox.ActionRole)
5050

51-
self.tree.doubleClicked.connect(self.executeAlgorithm)
51+
self.tree.doubleClicked.connect(self.executeAlgorithm)
5252
self.tree.currentItemChanged.connect(self.changeText)
5353
self.clearButton.clicked.connect(self.clearLog)
54+
55+
self.tree.customContextMenuRequested.connect(self.showPopupMenu)
5456

5557
self.fillTree()
5658

@@ -83,6 +85,30 @@ def changeText(self):
8385
item = self.tree.currentItem()
8486
if isinstance(item, TreeLogEntryItem):
8587
self.text.setText(item.entry.text.replace("|","\n"))
88+
89+
90+
91+
def createTest(self):
92+
item = self.tree.currentItem()
93+
if isinstance(item, TreeLogEntryItem):
94+
if item.isAlg:
95+
TestTools.createTest(item)
96+
97+
98+
99+
100+
101+
102+
103+
def showPopupMenu(self,point):
104+
item = self.tree.currentItem()
105+
if isinstance(item, TreeLogEntryItem):
106+
if item.isAlg:
107+
popupmenu = QMenu()
108+
createTestAction = QAction(self.tr("Create test"), self.tree)
109+
createTestAction.triggered.connect(self.createTest)
110+
popupmenu.addAction(createTestAction)
111+
popupmenu.exec_(self.tree.mapToGlobal(point))
86112

87113
class TreeLogEntryItem(QTreeWidgetItem):
88114
def __init__(self, entry, isAlg):
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
from sextante.core.Sextante import Sextante
2+
from sextante.outputs.OutputNumber import OutputNumber
3+
from sextante.outputs.OutputString import OutputString
4+
from sextante.outputs.OutputRaster import OutputRaster
5+
from osgeo import gdal
6+
from osgeo.gdalconst import GA_ReadOnly
7+
from sextante.core.QGisLayers import QGisLayers
8+
from sextante.outputs.OutputVector import OutputVector
9+
10+
def createTest(item):
11+
s = ""
12+
tokens = item.entry.text[len("sextante.runalg("):-1].split(",")
13+
cmdname = tokens[0][1:-1];
14+
methodname = "test_" + cmdname.replace(":","")
15+
s += "def " + methodname + "():\n"
16+
alg = Sextante.getAlgorithm(cmdname)
17+
execcommand = "sextante.runalg("
18+
i = 0
19+
for token in tokens:
20+
if i < alg.getVisibleParametersCount():
21+
execcommand+=token + ","
22+
else:
23+
execcommand+="None,"
24+
i+=1
25+
s += "\toutputs=" + execcommand[:-1] + ")\n"
26+
27+
i = -1 * len(alg.outputs)
28+
for out in alg.outputs:
29+
filename = tokens[i][1:-1]
30+
s+="\toutput=outputs['" + out.name + "']\n"
31+
if isinstance(out, (OutputNumber, OutputString)):
32+
s+="self.assertTrue(" + str(out) + ", output)\n"
33+
if isinstance(out, OutputRaster):
34+
dataset = gdal.Open(filename, GA_ReadOnly)
35+
array = dataset.ReadAsArray(1)
36+
s+="\tself.assertTrue(os.path.isfile(output))\n"
37+
s+="\tself.assertEqual(hashraster(output)," + str(hash(array)) + ")\n"
38+
if isinstance(out, OutputVector):
39+
layer = Sextante.getObject(filename)
40+
fields = layer.pendingFields()
41+
s+="\tlayer=sextante.getobject(output)\n"
42+
s+="\tfields=layer.pendingFields()\n"
43+
s+="\texpectednames=[" + ",".join([str(f.name()) for f in fields]) + "]\n"
44+
s+="\texpectedtypes=[" + ",".join([str(f.typeName()) for f in fields]) + "]\n"
45+
s+="\tnames=[str(f.name()) for f in fields]\n"
46+
s+="\ttypes=[str(f.typeName()) for f in fields]\n"
47+
s+="\tself.assertEqual(exceptednames, names)\n"
48+
s+="\tself.assertEqual(exceptedtypes, types)\n"
49+
features = QGisLayers.features(layer)
50+
numfeat = len(features)
51+
s+="\tfeatures=sextante.getfeatures(layer))\n"
52+
s+="\tself.assertEqual(" + str(numfeat) + ", len(features)\n"
53+
if numfeat > 0:
54+
feature = features.next()
55+
attrs = feature.attributes()
56+
s+="\tfeature=features.next()\n"
57+
s+="\tattrs=feature.attributes()\n"
58+
s+="\texpectedvalues=[" + ",".join([str(attr.toString()) for attr in attrs]) + "]\n"
59+
s+="\tvalues=[str(attr.toString()) for attr in attrs]\n"
60+
s+="\tself.assertEqual(exceptedtypes, types)\n"
61+
62+
dlg = ShowTestDialog(s)
63+
dlg.exec_()
64+
65+
from PyQt4 import QtCore, QtGui
66+
from PyQt4.QtCore import *
67+
from PyQt4.QtGui import *
68+
69+
class ShowTestDialog(QtGui.QDialog):
70+
def __init__(self, s):
71+
QtGui.QDialog.__init__(self)
72+
self.setModal(True)
73+
self.resize(600,400)
74+
self.setWindowTitle("Unit test")
75+
layout = QVBoxLayout()
76+
self.text = QtGui.QTextEdit()
77+
self.text.setEnabled(True)
78+
self.text.setText(s)
79+
layout.addWidget(self.text)
80+
self.setLayout(layout)
81+
QtCore.QMetaObject.connectSlotsByName(self)
82+
83+
84+

python/plugins/sextante/ui/ui_DlgHistory.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def setupUi(self, DlgHistory):
2929
self.tree.setObjectName(_fromUtf8("tree"))
3030
self.tree.headerItem().setText(0, _fromUtf8("1"))
3131
self.tree.header().setVisible(False)
32+
self.tree.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
3233
self.text = QtGui.QTextEdit(self.splitter)
3334
self.text.setReadOnly(True)
3435
self.text.setObjectName(_fromUtf8("text"))

0 commit comments

Comments
 (0)