source: sasview/src/sas/qtgui/Perspectives/Fitting/UnitTesting/ComplexConstraintTest.py @ a90c9c5

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalc
Last change on this file since a90c9c5 was a90c9c5, checked in by Piotr Rozyczko <rozyczko@…>, 6 years ago

Minor corrections to GUI and unit tests

  • Property mode set to 100755
File size: 5.2 KB
Line 
1import sys
2import unittest
3import numpy as np
4import webbrowser
5
6from unittest.mock import MagicMock
7
8from PyQt5 import QtGui, QtWidgets
9from PyQt5 import QtWebKit
10
11# set up import paths
12import path_prepare
13
14from sas.qtgui.Utilities.GuiUtils import Communicate
15
16# Local
17from sas.qtgui.Perspectives.Fitting.FittingWidget import FittingWidget
18from sas.qtgui.Perspectives.Fitting.ComplexConstraint import ComplexConstraint
19
20if not QtWidgets.QApplication.instance():
21    app = QtWidgets.QApplication(sys.argv)
22
23class dummy_manager(object):
24    HELP_DIRECTORY_LOCATION = "html"
25    communicate = Communicate()
26
27class ComplexConstraintTest(unittest.TestCase):
28    '''Test the ComplexConstraint dialog'''
29    def setUp(self):
30        '''Create ComplexConstraint dialog'''
31        # mockup tabs
32        self.tab1 = FittingWidget(dummy_manager())
33        self.tab2 = FittingWidget(dummy_manager())
34        # set some models on tabs
35        category_index = self.tab1.cbCategory.findText("Shape Independent")
36        self.tab1.cbCategory.setCurrentIndex(category_index)
37        category_index = self.tab2.cbCategory.findText("Cylinder")
38        self.tab2.cbCategory.setCurrentIndex(category_index)
39
40        tabs = [self.tab1, self.tab2]
41        self.widget = ComplexConstraint(parent=None, tabs=tabs)
42
43    def tearDown(self):
44        '''Destroy the GUI'''
45        self.widget.close()
46        self.widget = None
47
48    def testDefaults(self):
49        '''Test the GUI in its default state'''
50        self.assertIsInstance(self.widget, QtWidgets.QDialog)
51        # Default title
52        self.assertEqual(self.widget.windowTitle(), "Complex Constraint")
53
54        # Modal window
55        self.assertTrue(self.widget.isModal())
56
57        # initial tab names
58        self.assertEqual(self.widget.tab_names, ['M1','M1'])
59        self.assertIn('scale', self.widget.params[0])
60        self.assertIn('background', self.widget.params[1])
61
62    def testLabels(self):
63        ''' various labels on the widget '''
64        # params related setup
65        self.assertEqual(self.widget.txtConstraint.text(), 'M1.scale')
66        self.assertEqual(self.widget.txtOperator.text(), '=')
67        self.assertEqual(self.widget.txtName1.text(), 'M1')
68        self.assertEqual(self.widget.txtName2.text(), 'M1')
69
70    def testTooltip(self):
71        ''' test the tooltip'''
72        p1 = self.widget.tab_names[0] + ":" + self.widget.cbParam1.currentText()
73        p2 = self.widget.tab_names[1]+"."+self.widget.cbParam2.currentText()
74
75        tooltip = "E.g.\n%s = 2.0 * (%s)\n" %(p1, p2)
76        tooltip += "%s = sqrt(%s) + 5"%(p1, p2)
77        self.assertEqual(self.widget.txtConstraint.toolTip(), tooltip)
78
79    def testValidateFormula(self):
80        ''' assure enablement and color for valid formula '''
81        # Invalid string
82        self.widget.validateConstraint = MagicMock(return_value=False)
83        self.widget.validateFormula()
84        style_sheet = "QLineEdit {background-color: red;}"
85        self.assertFalse(self.widget.cmdOK.isEnabled())
86        self.assertEqual(self.widget.txtConstraint.styleSheet(),style_sheet)
87
88        # Valid string
89        self.widget.validateConstraint = MagicMock(return_value=True)
90        self.widget.validateFormula()
91        style_sheet = "QLineEdit {background-color: white;}"
92        self.assertTrue(self.widget.cmdOK.isEnabled())
93        self.assertEqual(self.widget.txtConstraint.styleSheet(),style_sheet)
94
95    def testValidateConstraint(self):
96        ''' constraint validator test'''
97        #### BAD
98        # none
99        self.assertFalse(self.widget.validateConstraint(None))
100        # inf
101        self.assertFalse(self.widget.validateConstraint(np.inf))
102        # 0
103        self.assertFalse(self.widget.validateConstraint(0))
104        # ""
105        self.assertFalse(self.widget.validateConstraint(""))
106        # p2_
107        self.assertFalse(self.widget.validateConstraint("M2.scale_"))
108        # p1
109        self.assertFalse(self.widget.validateConstraint("M2.scale"))
110
111        ### GOOD
112        # p2
113        self.assertTrue(self.widget.validateConstraint("scale"))
114        # " p2    "
115        self.assertTrue(self.widget.validateConstraint(" scale    "))
116        # sqrt(p2)
117        self.assertTrue(self.widget.validateConstraint("sqrt(scale)"))
118        # -p2
119        self.assertTrue(self.widget.validateConstraint("-scale"))
120        # log10(p2) - sqrt(p2) + p2
121        self.assertTrue(self.widget.validateConstraint("log10(scale) - sqrt(scale) + scale"))
122        # log10(    p2    ) +  p2
123        self.assertTrue(self.widget.validateConstraint("log10(    scale    ) +  scale  "))
124
125    def testConstraint(self):
126        """
127        Test the return of specified constraint
128        """
129        # default data
130        self.assertEqual(self.widget.constraint(), ('M1', 'scale', '=', 'M1.scale'))
131
132        # Change parameter and operand
133        self.widget.cbOperator.setCurrentIndex(3)
134        self.widget.cbParam1.setCurrentIndex(3)
135        self.assertEqual(self.widget.constraint(), ('M1', 'bjerrum_length', '>=', 'M1.scale'))
136
137    def testOnHelp(self):
138        """
139        Test the default help renderer
140        """
141        webbrowser.open = MagicMock()
142
143        # invoke the tested method
144        self.widget.onHelp()
145
146        # see that webbrowser open was attempted
147        webbrowser.open.assert_called_once()
Note: See TracBrowser for help on using the repository browser.