Skip to content

Commit 0f2eefd

Browse files
committed
PerfectDomaincontextHandler: Fix clone_context
As PerfectDomainContextHandler uses different *args from its BaseClass, it needs to override the clone_context method.
1 parent 5e3b7b7 commit 0f2eefd

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from Orange.data import Table
2+
from Orange.widgets.data.owcolor import OWColor
3+
from Orange.widgets.tests.base import WidgetTest
4+
5+
6+
class TestOWColor(WidgetTest):
7+
def setUp(self):
8+
self.widget = self.create_widget(OWColor)
9+
10+
self.iris = Table("iris")
11+
12+
def test_reuse_old_settings(self):
13+
self.send_signal("Data", self.iris)
14+
15+
assert isinstance(self.widget, OWColor)
16+
self.widget.saveSettings()
17+
18+
w = self.create_widget(OWColor, reset_default_settings=False)
19+
self.send_signal("Data", self.iris, widget=w)

Orange/widgets/settings.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,13 @@ def new_context(self, domain, attributes, class_vars, metas):
10831083
context.class_vars = class_vars
10841084
return context
10851085

1086+
def clone_context(self, old_context, *args):
1087+
"""Copy of context is always valid, since widgets are using
1088+
the same domain."""
1089+
context = self.new_context(*args)
1090+
context.values = copy.deepcopy(old_context.values)
1091+
return context
1092+
10861093
def encode_domain(self, domain):
10871094
"""Encode domain into tuples (name, type)
10881095
A tuple is returned for each of attributes, class_vars and metas.

Orange/widgets/tests/base.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def tearDownClass(cls):
8989
w.onDeleteWidget()
9090
sip.delete(w)
9191

92-
def create_widget(self, cls, stored_settings=None):
92+
def create_widget(self, cls, stored_settings=None, reset_default_settings=True):
9393
"""Create a widget instance.
9494
9595
Parameters
@@ -98,12 +98,16 @@ def create_widget(self, cls, stored_settings=None):
9898
Widget class to instantiate
9999
stored_settings : dict
100100
Default values for settings
101+
reset_default_settings : bool
102+
If set, widget will start with default values for settings,
103+
if not, values accumulated through the session will be used
101104
102105
Returns
103106
-------
104107
Widget instance : cls
105108
"""
106-
self.reset_default_settings(cls)
109+
if reset_default_settings:
110+
self.reset_default_settings(cls)
107111
widget = cls.__new__(cls, signal_manager=self.signal_manager,
108112
stored_settings=stored_settings)
109113
widget.__init__()
@@ -138,6 +142,15 @@ def process_events():
138142
"""
139143
app.processEvents()
140144

145+
def show(self, widget=None):
146+
"""Show widget in interactive mode.
147+
148+
Useful for debugging tests, as widget can be inspected manually.
149+
"""
150+
widget = widget or self.widget
151+
widget.show()
152+
app.exec()
153+
141154
def send_signal(self, input_name, value, id=None, widget=None):
142155
""" Send signal to widget by calling appropriate triggers.
143156

0 commit comments

Comments
 (0)