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

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 da9a0722 was da9a0722, checked in by Piotr Rozyczko <rozyczko@…>, 6 years ago

unit test updates

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