Skip to content

Commit 7a98759

Browse files
Add Skip counter and corresponding colored icon to Project tree (#2480)
* Set default language to en_US * Add skip counter and colored icon to project tree
1 parent 37cb471 commit 7a98759

File tree

10 files changed

+77
-9
lines changed

10 files changed

+77
-9
lines changed

CHANGELOG.adoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to http://semver.org/spec/v2.0.0.html[Semantic Versioni
1010

1111
=== Added
1212

13+
- Added skipped tests counter and corresponding colored icon on Project tree
1314
- Added color processing in console log, when using ``-C`` or ``--consolecolors``
1415
- Added minimal support to open and edit resource files in Grid Editor
1516
- Added multiline comment and uncomment in Text Editor
@@ -70,6 +71,7 @@ and this project adheres to http://semver.org/spec/v2.0.0.html[Semantic Versioni
7071

7172
=== Fixed
7273

74+
- Fixed removal of animation in Project tree when test run is interrupted
7375
- Fixed console log width to fit visible area, depending on font size
7476
- Fixed not possible to use filenames/paths with spaces in TestRunner arguments. Use double quotes for space separated values,
7577
- Fixed error preventing to open old format, HTML test suites:

src/robotide/application/application.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def __init__(self, path=None, updatecheck=True):
6161
def OnInit(self):
6262
# DEBUG To test RTL
6363
# self._initial_locale = wx.Locale(wx.LANGUAGE_ARABIC)
64-
self._initial_locale = wx.Locale(wx.LANGUAGE_ENGLISH)
64+
self._initial_locale = wx.Locale(wx.LANGUAGE_ENGLISH_US)
6565
# Needed for SetToolTipString to work
6666
wx.HelpProvider.Set(wx.SimpleHelpProvider()) # TODO adjust to wx versions
6767
self.settings = RideSettings()

src/robotide/contrib/testrunner/testrunner.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ def _result_handler(self, event, *args):
116116
if args[1]['status'] == 'PASS':
117117
self._results.set_passed(self._get_test_controller(longname,
118118
testname))
119+
elif args[1]['status'] == 'SKIP':
120+
self._results.set_skipped(self._get_test_controller(longname,
121+
testname))
119122
else:
120123
self._results.set_failed(self._get_test_controller(longname,
121124
testname))
@@ -181,6 +184,7 @@ def is_running(self):
181184
return self._process and self._process.is_alive()
182185

183186
def command_ended(self):
187+
self._results.set_stopped(None)
184188
self._process = None
185189

186190

src/robotide/contrib/testrunner/testrunnerplugin.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1049,8 +1049,12 @@ def _handle_end_test(self, args):
10491049
f"Ending test: {longname.decode(encoding['OUTPUT'], 'backslashreplace')}\n")
10501050
if args[1]['status'] == 'PASS':
10511051
self._progress_bar.add_pass()
1052-
else:
1052+
elif args[1]['status'] == 'SKIP':
1053+
self._progress_bar.add_skip()
1054+
elif args[1]['status'] == 'FAIL':
10531055
self._progress_bar.add_fail()
1056+
else:
1057+
self._log_message_queue.put(f"UNKNOWN STATUS: {args[1]['status']}\n")
10541058

10551059
def _handle_report_file(self, args):
10561060
self._report_file = args[0]
@@ -1142,6 +1146,7 @@ def __init__(self, parent, fail_color='#FF8E8E', pass_color="#9FCC9F", skip_colo
11421146
self.SetSizer(self._sizer)
11431147
self._gauge.Hide()
11441148
self._default_colour = parent.GetBackgroundColour()
1149+
self._foreground_colour = parent.GetForegroundColour()
11451150
self.fail_color = fail_color
11461151
self.pass_color = pass_color
11471152
self.skip_color = skip_color
@@ -1175,6 +1180,7 @@ def Start(self):
11751180
self._gauge.Show()
11761181
self._sizer.Layout()
11771182
self.SetBackgroundColour(self._default_colour)
1183+
self.SetForegroundColour(self._foreground_colour)
11781184
self._timer.Start(50)
11791185

11801186
def Stop(self):
@@ -1194,6 +1200,17 @@ def add_skip(self):
11941200
"""Add one to the skipped count"""
11951201
self._skip += 1
11961202

1203+
def get_visible_color(self, color):
1204+
color_diff = wx.Colour.GetRGBA(wx.Colour(color)) - wx.Colour.GetRGBA(self._foreground_colour)
1205+
# print(f"DEBUG: get_visible_color color={wx.Colour.GetRGBA(wx.Colour(color)):0x} default={wx.Colour.GetRGBA(self._foreground_colour):0x}"
1206+
# f" color_diff={wx.Colour.GetRGBA(wx.Colour(color_diff)):0x} white={wx.Colour.GetRGBA(wx.Colour('white')):0x}"
1207+
# f" black={wx.Colour.GetRGBA(wx.Colour('black')):0x} gray={wx.Colour.GetRGBA(wx.Colour('gray')):0x}")
1208+
if wx.Colour.GetRGBA(wx.Colour(color)) > wx.Colour.GetRGBA(self._foreground_colour) > wx.Colour.GetRGBA(wx.Colour('gray')):
1209+
if color_diff > wx.Colour.GetRGBA(wx.Colour('gray')):
1210+
return wx.Colour(self._foreground_colour)
1211+
return wx.Colour('black')
1212+
1213+
11971214
def _update_message(self):
11981215
"""Update the displayed elapsed time, passed and failed counts"""
11991216
elapsed = time.time() - self._start_time
@@ -1202,10 +1219,13 @@ def _update_message(self):
12021219
message += self._get_current_keyword_text()
12031220
self._label.SetLabel(message)
12041221
if self._fail > 0:
1222+
self.SetForegroundColour(self.get_visible_color(self.fail_color))
12051223
self.SetBackgroundColour(self.fail_color)
12061224
elif self._skip > 0:
1225+
self.SetForegroundColour(self.get_visible_color(self.skip_color))
12071226
self.SetBackgroundColour(self.skip_color)
12081227
elif self._pass > 0:
1228+
self.SetForegroundColour(self.get_visible_color(self.pass_color))
12091229
self.SetBackgroundColour(self.pass_color)
12101230
# not sure why this is required, but without it the background
12111231
# colors don't look right on Windows

src/robotide/controller/testexecutionresults.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,17 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16-
from ..publish.messages import RideTestExecutionStarted, RideTestPaused, RideTestPassed, RideTestFailed, RideTestRunning
16+
from ..publish.messages import (RideTestExecutionStarted, RideTestPaused, RideTestPassed, RideTestFailed,
17+
RideTestRunning, RideTestSkipped, RideTestStopped)
1718

1819

1920
class TestExecutionResults(object):
2021
RUNNING = 'Running'
22+
STOPPED = 'Stopped'
2123
PASSED = 'Passed'
2224
FAILED = 'Failed'
2325
PAUSED = 'Paused'
26+
SKIPPED = 'Skipped'
2427

2528
def __init__(self):
2629
self.clear()
@@ -36,6 +39,11 @@ def set_running(self, test):
3639
self._results[test] = self.RUNNING
3740
RideTestRunning(item=test).publish()
3841

42+
def set_stopped(self, test):
43+
if test:
44+
self._results[test] = self.STOPPED
45+
RideTestStopped(item=test).publish()
46+
3947
def set_passed(self, test):
4048
self._results[test] = self.PASSED
4149
RideTestPassed(item=test).publish()
@@ -48,6 +56,10 @@ def set_paused(self, test):
4856
self._results[test] = self.PAUSED
4957
RideTestPaused(item=test).publish()
5058

59+
def set_skipped(self, test):
60+
self._results[test] = self.SKIPPED
61+
RideTestSkipped(item=test).publish()
62+
5163
def is_running(self, test):
5264
return test in self._results and self._results[test] == self.RUNNING
5365

@@ -60,3 +72,6 @@ def has_passed(self, test):
6072
def has_failed(self, test):
6173
return test in self._results and self._results[test] == self.FAILED
6274

75+
def has_skipped(self, test):
76+
return test in self._results and self._results[test] == self.SKIPPED
77+

src/robotide/publish/messages.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
from robotide import utils
2222

23+
2324
class RideMessage:
2425
"""Base class for all messages sent by RIDE.
2526
@@ -205,12 +206,22 @@ class RideTestPaused(RideMessage):
205206

206207

207208
class RideTestPassed(RideMessage):
208-
"""Sent whenever RIDE has executed a test case and it passed."""
209+
"""Sent whenever RIDE has executed a test case, and it passed."""
209210
data = ['item']
210211

211212

212213
class RideTestFailed(RideMessage):
213-
"""Sent whenever RIDE has executed a test case and it failed."""
214+
"""Sent whenever RIDE has executed a test case, and it failed."""
215+
data = ['item']
216+
217+
218+
class RideTestSkipped(RideMessage):
219+
"""Sent whenever RIDE has executed a test case, and it was skipped."""
220+
data = ['item']
221+
222+
223+
class RideTestStopped(RideMessage):
224+
"""Sent whenever RIDE was executing a test case, and it was stopped or aborted."""
214225
data = ['item']
215226

216227

src/robotide/ui/images.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
PASSED_IMAGE_INDEX = 8
3434
FAILED_IMAGE_INDEX = 9
3535
PAUSED_IMAGE_INDEX = 10
36+
SKIPPED_IMAGE_INDEX = 11
3637

3738

3839
class TreeImageList(wx.ImageList):
@@ -52,6 +53,7 @@ def __init__(self):
5253
'passed': _TreeImage(self, 'robot_passed.png'),
5354
'failed': _TreeImage(self, 'robot_failed.png'),
5455
'paused': _TreeImage(self, 'robot-pause.gif'),
56+
'skipped': _TreeImage(self, 'robot_skipped.png'),
5557
filecontrollers.ExcludedDirectoryController: _TreeImage(self, 'folder_excluded.png')
5658
}
5759
# 'running': _TreeImage(self, 'robot_running.png'),
@@ -73,6 +75,8 @@ def __getitem__(self, controller):
7375
return self._images['passed']
7476
if self._execution_results.has_failed(controller):
7577
return self._images['failed']
78+
if self._execution_results.has_skipped(controller):
79+
return self._images['skipped']
7680
elif controller.__class__ == filecontrollers.TestDataDirectoryController:
7781
if not controller.contains_tests():
7882
return self._images['resource directory']

src/robotide/ui/treeplugin.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@
3030

3131
from ..context import IS_WINDOWS
3232
# from ..controller.filecontrollers import ResourceFileController, TestDataDirectoryController, TestCaseFileController
33-
from ..publish.messages import (RideTestRunning, RideTestPaused, RideTestPassed, RideTestFailed,
34-
RideTestExecutionStarted, RideImportSetting, RideExcludesChanged, RideIncludesChanged,
33+
from ..publish.messages import (RideTestRunning, RideTestPaused, RideTestPassed, RideTestFailed, RideTestSkipped,
34+
RideTestExecutionStarted, RideTestStopped, RideImportSetting, RideExcludesChanged, RideIncludesChanged,
3535
RideOpenSuite, RideNewProject)
3636
from ..ui.images import (RUNNING_IMAGE_INDEX, PASSED_IMAGE_INDEX, FAILED_IMAGE_INDEX, PAUSED_IMAGE_INDEX,
37-
ROBOT_IMAGE_INDEX)
37+
SKIPPED_IMAGE_INDEX, ROBOT_IMAGE_INDEX)
3838
from ..ui.treenodehandlers import TestCaseHandler, TestDataDirectoryHandler, TestCaseFileHandler
3939
from ..publish import (PUBLISHER, RideTreeSelection, RideFileNameChanged, RideItem, RideUserKeywordAdded,
4040
RideTestCaseAdded, RideUserKeywordRemoved, RideTestCaseRemoved, RideDataFileRemoved,
@@ -319,6 +319,8 @@ def _subscribe_to_messages(self):
319319
(self._test_result, RideTestPaused),
320320
(self._test_result, RideTestPassed),
321321
(self._test_result, RideTestFailed),
322+
(self._test_result, RideTestSkipped),
323+
(self._test_result, RideTestStopped),
322324
(self._handle_import_setting_message, RideImportSetting),
323325
(self._mark_excludes, RideExcludesChanged),
324326
(self._mark_excludes, RideIncludesChanged),
@@ -369,11 +371,19 @@ def _test_result(self, message):
369371
test: TestCaseController = message.item
370372
if not test:
371373
# test object will be None when running with DataDriver
374+
# when runner is interrupted, is also None, so let's stop animation
375+
if self._animctrl:
376+
self._animctrl.Stop()
377+
self._animctrl.Animation.Destroy()
378+
self._animctrl.Destroy()
379+
self._animctrl = None
372380
return
373381
if isinstance(message, RideTestPassed):
374382
test.run_passed = True
375383
elif isinstance(message, RideTestFailed):
376384
test.run_passed = False
385+
elif isinstance(message, RideTestSkipped):
386+
test.run_passed = False
377387
else:
378388
test.run_passed = None
379389
wx.CallAfter(self._set_icon_from_execution_results, message.item)
@@ -423,6 +433,8 @@ def _get_icon_index_for(self, controller):
423433
return PASSED_IMAGE_INDEX
424434
if self._execution_results.has_failed(controller):
425435
return FAILED_IMAGE_INDEX
436+
if self._execution_results.has_skipped(controller):
437+
return SKIPPED_IMAGE_INDEX
426438
return ROBOT_IMAGE_INDEX
427439

428440
def populate(self, model):

src/robotide/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@
1414
# limitations under the License.
1515
#
1616
# Automatically generated by `tasks.py`.
17-
VERSION = 'v2.0b2.dev21'
17+
VERSION = 'v2.0b2.dev22'
5.2 KB
Loading

0 commit comments

Comments
 (0)