Changeset d79bb7e in sasview for src/sas/qtgui


Ignore:
Timestamp:
Apr 26, 2018 2:43:31 PM (7 years ago)
Author:
krzywon
Branches:
ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc
Children:
6bd0d81
Parents:
0662f53
Message:

Penultimate group of working unit tests for qtgui P(r)

Location:
src/sas/qtgui/Perspectives/Inversion
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py

    r044454d rd79bb7e  
    8989        self.dataDeleted = False 
    9090 
    91         self.enableButtons() 
    92  
    9391        self.model = QtGui.QStandardItemModel(self) 
    9492        self.mapper = QtWidgets.QDataWidgetMapper(self) 
     
    175173        self.explorerButton.clicked.connect(self.openExplorerWindow) 
    176174 
    177         self.backgroundInput.editingFinished.connect( 
     175        self.backgroundInput.textChanged.connect( 
    178176            lambda: self.set_background(self.backgroundInput.text())) 
    179         self.minQInput.editingFinished.connect( 
     177        self.minQInput.textChanged.connect( 
    180178            lambda: self._calculator.set_qmin(is_float(self.minQInput.text()))) 
    181         self.regularizationConstantInput.editingFinished.connect( 
     179        self.regularizationConstantInput.textChanged.connect( 
    182180            lambda: self._calculator.set_alpha(is_float(self.regularizationConstantInput.text()))) 
    183         self.maxDistanceInput.editingFinished.connect( 
     181        self.maxDistanceInput.textChanged.connect( 
    184182            lambda: self._calculator.set_dmax(is_float(self.maxDistanceInput.text()))) 
    185         self.maxQInput.editingFinished.connect( 
     183        self.maxQInput.textChanged.connect( 
    186184            lambda: self._calculator.set_qmax(is_float(self.maxQInput.text()))) 
    187         self.slitHeightInput.editingFinished.connect( 
     185        self.slitHeightInput.textChanged.connect( 
    188186            lambda: self._calculator.set_slit_height(is_float(self.slitHeightInput.text()))) 
    189         self.slitWidthInput.editingFinished.connect( 
    190             lambda: self._calculator.set_slit_width(is_float(self.slitHeightInput.text()))) 
     187        self.slitWidthInput.textChanged.connect( 
     188            lambda: self._calculator.set_slit_width(is_float(self.slitWidthInput.text()))) 
    191189 
    192190        self.model.itemChanged.connect(self.model_changed) 
     
    245243        Update boxes with initial values 
    246244        """ 
    247         blank_item = QtGui.QStandardItem("") 
     245        bgd_item = QtGui.QStandardItem(str(BACKGROUND_INPUT)) 
     246        self.model.setItem(WIDGETS.W_BACKGROUND_INPUT, bgd_item) 
     247        blank_item = QtGui.QStandardItem("") 
     248        self.model.setItem(WIDGETS.W_QMIN, blank_item) 
     249        blank_item = QtGui.QStandardItem("") 
     250        self.model.setItem(WIDGETS.W_QMAX, blank_item) 
     251        blank_item = QtGui.QStandardItem("") 
     252        self.model.setItem(WIDGETS.W_SLIT_WIDTH, blank_item) 
     253        blank_item = QtGui.QStandardItem("") 
     254        self.model.setItem(WIDGETS.W_SLIT_HEIGHT, blank_item) 
    248255        no_terms_item = QtGui.QStandardItem(str(NUMBER_OF_TERMS)) 
     256        self.model.setItem(WIDGETS.W_NO_TERMS, no_terms_item) 
     257        reg_item = QtGui.QStandardItem(str(REGULARIZATION)) 
     258        self.model.setItem(WIDGETS.W_REGULARIZATION, reg_item) 
     259        max_dist_item = QtGui.QStandardItem(str(MAX_DIST)) 
     260        self.model.setItem(WIDGETS.W_MAX_DIST, max_dist_item) 
     261        blank_item = QtGui.QStandardItem("") 
     262        self.model.setItem(WIDGETS.W_RG, blank_item) 
     263        blank_item = QtGui.QStandardItem("") 
     264        self.model.setItem(WIDGETS.W_I_ZERO, blank_item) 
    249265        bgd_item = QtGui.QStandardItem(str(BACKGROUND_INPUT)) 
    250         reg_item = QtGui.QStandardItem(str(REGULARIZATION)) 
    251         max_dist_item = QtGui.QStandardItem(str(MAX_DIST)) 
    252         self.model.setItem(WIDGETS.W_BACKGROUND_INPUT, bgd_item) 
    253         self.model.setItem(WIDGETS.W_QMIN, blank_item) 
    254         self.model.setItem(WIDGETS.W_QMAX, blank_item) 
    255         self.model.setItem(WIDGETS.W_SLIT_WIDTH, blank_item) 
    256         self.model.setItem(WIDGETS.W_SLIT_HEIGHT, blank_item) 
    257         self.model.setItem(WIDGETS.W_NO_TERMS, no_terms_item) 
    258         self.model.setItem(WIDGETS.W_REGULARIZATION, reg_item) 
    259         self.model.setItem(WIDGETS.W_MAX_DIST, max_dist_item) 
    260         self.model.setItem(WIDGETS.W_RG, blank_item) 
    261         self.model.setItem(WIDGETS.W_I_ZERO, blank_item) 
    262266        self.model.setItem(WIDGETS.W_BACKGROUND_OUTPUT, bgd_item) 
     267        blank_item = QtGui.QStandardItem("") 
    263268        self.model.setItem(WIDGETS.W_COMP_TIME, blank_item) 
     269        blank_item = QtGui.QStandardItem("") 
    264270        self.model.setItem(WIDGETS.W_CHI_SQUARED, blank_item) 
     271        blank_item = QtGui.QStandardItem("") 
    265272        self.model.setItem(WIDGETS.W_OSCILLATION, blank_item) 
     273        blank_item = QtGui.QStandardItem("") 
    266274        self.model.setItem(WIDGETS.W_POS_FRACTION, blank_item) 
     275        blank_item = QtGui.QStandardItem("") 
    267276        self.model.setItem(WIDGETS.W_SIGMA_POS_FRACTION, blank_item) 
    268277 
     
    296305        self.explorerButton.setEnabled(self.logic.data_is_loaded) 
    297306        self.regConstantSuggestionButton.setEnabled( 
     307            self.logic.data_is_loaded and 
    298308            self._calculator.suggested_alpha != self._calculator.alpha) 
    299309        self.noOfTermsSuggestionButton.setEnabled( 
     310            self.logic.data_is_loaded and 
    300311            self._calculator.nfunc != self.nTermsSuggested) 
    301312 
     
    522533        """Remove the existing data reference from the P(r) Persepective""" 
    523534        self.dataDeleted = True 
     535        self.batchResults = {} 
    524536        if not data_list: 
    525537            data_list = [self._data] 
     
    555567 
    556568    def startThreadAll(self): 
     569        self.isBatch = True 
     570        self.batchComplete = [] 
    557571        self.calculateAllButton.setText("Calculating...") 
    558         self.batchComplete = [] 
    559         self.isBatch = True 
     572        self.enableButtons() 
     573        self.batchResultsWindow = BatchInversionOutputPanel( 
     574            parent=self, output_data=self.batchResults) 
    560575        self.performEstimate() 
    561576 
     
    571586        else: 
    572587            # If no data sets left, end batch calculation 
     588            self.batchComplete = [] 
    573589            self.calculateAllButton.setText("Calculate All") 
    574590            self.showBatchOutput() 
  • src/sas/qtgui/Perspectives/Inversion/UnitTesting/InversionPerspectiveTest.py

    r0662f53 rd79bb7e  
    1 import sys 
     1import time 
    22import unittest 
    3 import logging 
    43from unittest.mock import MagicMock 
    54 
    65from PyQt5 import QtGui, QtWidgets 
    7 from PyQt5.QtTest import QTest 
    8 from PyQt5 import QtCore 
    9  
    10 import sas.qtgui.path_prepare 
     6 
     7from sas.qtgui.Utilities.GuiUtils import * 
    118from sas.qtgui.Perspectives.Inversion.InversionPerspective import InversionWindow 
    129from sas.qtgui.Perspectives.Inversion.InversionUtils import WIDGETS 
    13 from sas.sascalc.dataloader.loader import Loader 
    1410from sas.qtgui.Plotting.PlotterData import Data1D 
    1511 
    16 from sas.qtgui.MainWindow.DataManager import DataManager 
    17 import sas.qtgui.Utilities.LocalConfig 
    1812import sas.qtgui.Utilities.GuiUtils as GuiUtils 
    1913 
     
    2216 
    2317 
     18class dummy_manager(object): 
     19    HELP_DIRECTORY_LOCATION = "html" 
     20    communicate = Communicate() 
     21 
     22    def communicator(self): 
     23        return self.communicate 
     24 
     25 
    2426class InversionTest(unittest.TestCase): 
    2527    """ Test the Inversion Perspective GUI """ 
     
    2729    def setUp(self): 
    2830        """ Create the InversionWindow """ 
    29         self.widget = InversionWindow(None) 
    30         self.widget.performEstimate = MagicMock() 
     31        self.widget = InversionWindow(dummy_manager()) 
     32        self.widget.show() 
    3133        self.fakeData1 = GuiUtils.HashableStandardItem("A") 
    3234        self.fakeData2 = GuiUtils.HashableStandardItem("B") 
    3335        reference_data1 = Data1D(x=[0.1, 0.2], y=[0.0, 0.0], dy=[0.0, 0.0]) 
     36        reference_data1.filename = "Test A" 
    3437        reference_data2 = Data1D(x=[0.1, 0.2], y=[0.0, 0.0], dy=[0.0, 0.0]) 
    35         GuiUtils.updateModelItem(self.fakeData1, [reference_data1]) 
    36         GuiUtils.updateModelItem(self.fakeData2, [reference_data2]) 
     38        reference_data2.filename = "Test B" 
     39        GuiUtils.updateModelItem(self.fakeData1, reference_data1) 
     40        GuiUtils.updateModelItem(self.fakeData2, reference_data2) 
    3741 
    3842    def tearDown(self): 
    3943        """ Destroy the InversionWindow """ 
    40         self.widget.setClosable(True) 
     44        self.widget.setClosable(False) 
    4145        self.widget.close() 
    4246        self.widget = None 
     
    4448    def removeAllData(self): 
    4549        """ Cleanup method to restore widget to its base state """ 
    46         while len(self.widget.dataList) > 0: 
    47             self.widget.removeData() 
     50        if len(self.widget.dataList) > 0: 
     51            remove_me = list(self.widget._dataList.keys()) 
     52            self.widget.removeData(remove_me) 
    4853 
    4954    def baseGUIState(self): 
     
    105110        self.assertEqual(self.widget.backgroundInput.text(), "0.0") 
    106111        self.assertEqual(self.widget.minQInput.text(), "") 
    107         self.assertEqual(self.widget.maxQInput.text(), self.widget.minQInput.text()) 
     112        self.assertEqual(self.widget.maxQInput.text(), "") 
    108113        self.assertEqual(self.widget.regularizationConstantInput.text(), "0.0001") 
    109114        self.assertEqual(self.widget.noOfTermsInput.text(), "10") 
     
    116121        self.assertEqual(self.widget.dataList.count(), 1) 
    117122        # See that the buttons are now enabled properly 
     123        self.widget.enableButtons() 
    118124        self.assertFalse(self.widget.calculateAllButton.isEnabled()) 
    119125        self.assertTrue(self.widget.calculateThisButton.isEnabled()) 
     
    127133        self.assertEqual(self.widget.dataList.count(), 2) 
    128134        # See that the buttons are now enabled properly 
     135        self.widget.enableButtons() 
     136        self.assertTrue(self.widget.calculateThisButton.isEnabled()) 
    129137        self.assertTrue(self.widget.calculateAllButton.isEnabled()) 
    130         self.assertTrue(self.widget.calculateThisButton.isEnabled()) 
    131138        self.assertTrue(self.widget.removeButton.isEnabled()) 
    132139        self.assertTrue(self.widget.explorerButton.isEnabled()) 
     
    137144        self.zeroDataSetState() 
    138145        self.baseBatchState() 
     146        self.removeAllData() 
    139147 
    140148    def testAllowBatch(self): 
    141149        """ Batch P(r) Tests """ 
     150        self.baseBatchState() 
     151        self.widget.setData([self.fakeData1]) 
     152        self.oneDataSetState() 
     153        self.widget.setData([self.fakeData2]) 
     154        self.twoDataSetState() 
     155        self.widget.calculateAllButton.click() 
     156        self.assertTrue(self.widget.batchResultsWindow is not None) 
     157        self.assertEqual(self.widget.batchResultsWindow.tblParams.columnCount(), 9) 
     158        self.assertEqual(self.widget.batchResultsWindow.tblParams.rowCount(), 2) 
     159        if self.widget.isBatch: 
     160            self.widget.isBatch = False 
     161        self.widget.batchResultsWindow.close() 
     162        self.assertTrue(self.widget.batchResultsWindow is None) 
     163        # Last test 
     164        self.widget.removeData() 
     165        self.removeAllData() 
    142166        self.baseBatchState() 
    143167 
     
    153177        self.removeAllData() 
    154178        self.zeroDataSetState() 
     179        self.removeAllData() 
    155180 
    156181    def testRemoveData(self): 
     
    161186        self.widget.removeData() 
    162187        self.oneDataSetState() 
     188        self.removeAllData() 
    163189 
    164190    def testClose(self): 
     
    166192        self.assertFalse(self.widget.isClosable()) 
    167193        self.widget.close() 
    168         self.assertTrue(self.widget.isVisible()) 
     194        self.assertTrue(self.widget.isMinimized()) 
     195        self.assertTrue(self.widget.dmaxWindow is None) 
     196        self.assertTrue(self.widget.batchResultsWindow is None) 
    169197        self.widget.setClosable(False) 
    170198        self.assertFalse(self.widget.isClosable()) 
    171199        self.widget.close() 
    172         self.assertTrue(self.widget.isVisible()) 
     200        self.assertTrue(self.widget.isMinimized()) 
    173201        self.widget.setClosable(True) 
    174202        self.assertTrue(self.widget.isClosable()) 
    175203        self.widget.setClosable() 
    176204        self.assertTrue(self.widget.isClosable()) 
    177         self.widget.close() 
    178         self.assertFalse(self.widget.isVisible()) 
     205        self.removeAllData() 
    179206 
    180207    def testGetNFunc(self): 
     
    198225            self.assertEqual(cm.output, ['ERROR:root:Incorrect number of terms specified: Nordvest Pizza']) 
    199226        self.assertEqual(self.widget.getNFunc(), 10) 
     227        self.removeAllData() 
    200228 
    201229    def testSetCurrentData(self): 
     
    214242        self.widget.setCurrentData(self.fakeData1) 
    215243        self.assertEqual(self.widget._data, self.fakeData1) 
    216  
    217     def notestModelChanged(self): 
    218         """ test the model update """ 
    219         self.assertTrue(self.widget._calculator.get_dmax(), 140.0) 
    220         self.widget.maxDistanceInput.setText("750.0") 
    221         self.assertTrue(self.widget._calculator.get_dmax(), 750.0) 
    222         self.assertTrue(self.widget._calculator.get_qmax(), 0.0) 
    223         self.widget.maxQInput.setText("100.0") 
    224         self.assertTrue(self.widget._calculator.get_dmax(), 100.0) 
     244        self.removeAllData() 
     245 
     246    def testModelChanged(self): 
     247        """ Test setting the input and the model and vice-versa """ 
     248        # Initial values 
     249        self.assertEqual(self.widget._calculator.get_dmax(), 140.0) 
     250        self.assertEqual(self.widget._calculator.get_qmax(), -1.0) 
     251        self.assertEqual(self.widget._calculator.get_qmin(), -1.0) 
     252        self.assertEqual(self.widget._calculator.slit_height, 0.0) 
     253        self.assertEqual(self.widget._calculator.slit_width, 0.0) 
     254        self.assertEqual(self.widget._calculator.alpha, 0.0001) 
     255        # Set new values 
     256        self.widget.maxDistanceInput.setText("1.0") 
     257        self.widget.maxQInput.setText("3.0") 
     258        self.widget.minQInput.setText("5.0") 
     259        self.widget.slitHeightInput.setText("7.0") 
     260        self.widget.slitWidthInput.setText("9.0") 
     261        self.widget.regularizationConstantInput.setText("11.0") 
     262        # Check new values 
     263        self.assertEqual(self.widget._calculator.get_dmax(), 1.0) 
     264        self.assertEqual(self.widget._calculator.get_qmax(), 3.0) 
     265        self.assertEqual(self.widget._calculator.get_qmin(), 5.0) 
     266        self.assertEqual(self.widget._calculator.slit_height, 7.0) 
     267        self.assertEqual(self.widget._calculator.slit_width, 9.0) 
     268        self.assertEqual(self.widget._calculator.alpha, 11.0) 
     269        # Change model directly 
     270        self.widget.model.setItem(WIDGETS.W_MAX_DIST, QtGui.QStandardItem("2.0")) 
     271        self.widget.model.setItem(WIDGETS.W_QMIN, QtGui.QStandardItem("4.0")) 
     272        self.widget.model.setItem(WIDGETS.W_QMAX, QtGui.QStandardItem("6.0")) 
     273        self.widget.model.setItem(WIDGETS.W_SLIT_HEIGHT, QtGui.QStandardItem("8.0")) 
     274        self.widget.model.setItem(WIDGETS.W_SLIT_WIDTH, QtGui.QStandardItem("10.0")) 
     275        self.widget.model.setItem(WIDGETS.W_REGULARIZATION, QtGui.QStandardItem("12.0")) 
     276        # Check values 
     277        self.assertEqual(self.widget._calculator.get_dmax(), 2.0) 
     278        self.assertEqual(self.widget._calculator.get_qmin(), 4.0) 
     279        self.assertEqual(self.widget._calculator.get_qmax(), 6.0) 
     280        self.assertEqual(self.widget._calculator.slit_height, 8.0) 
     281        self.assertEqual(self.widget._calculator.slit_width, 10.0) 
     282        self.assertEqual(self.widget._calculator.alpha, 12.0) 
     283        self.removeAllData() 
    225284 
    226285    def notestHelp(self): 
Note: See TracChangeset for help on using the changeset viewer.