1# -*- coding: utf-8 -*- 2"""QGIS Unit tests for QgsRasterBandComboBox. 3 4.. note:: This program is free software; you can redistribute it and/or modify 5it under the terms of the GNU General Public License as published by 6the Free Software Foundation; either version 2 of the License, or 7(at your option) any later version. 8""" 9__author__ = 'Nyall Dawson' 10__date__ = '09/05/2017' 11__copyright__ = 'Copyright 2017, The QGIS Project' 12 13import qgis # NOQA 14import os 15 16from qgis.core import QgsRasterLayer 17from qgis.gui import QgsRasterBandComboBox 18from qgis.testing import start_app, unittest 19from qgis.PyQt.QtCore import QFileInfo 20from qgis.PyQt.QtTest import QSignalSpy 21from utilities import unitTestDataPath 22 23start_app() 24 25 26class TestQgsRasterBandComboBox(unittest.TestCase): 27 28 def testNoLayer(self): 29 """ 30 Test widget with no layer 31 """ 32 33 combo = QgsRasterBandComboBox() 34 self.assertFalse(combo.layer()) 35 self.assertEqual(combo.currentBand(), -1) 36 self.assertTrue(combo.isEditable()) 37 38 combo.setShowNotSetOption(True) 39 self.assertEqual(combo.currentBand(), -1) 40 self.assertTrue(combo.isEditable()) 41 42 combo.setBand(11111) 43 self.assertEqual(combo.currentBand(), 11111) 44 combo.setBand(-11111) 45 self.assertEqual(combo.currentBand(), -1) 46 47 def testInvalidLayer(self): 48 layer = QgsRasterLayer('blah', 'blah') 49 self.assertTrue(layer) 50 self.assertFalse(layer.isValid()) 51 combo = QgsRasterBandComboBox() 52 combo.setLayer(layer) 53 self.assertEqual(combo.count(), 0) 54 self.assertTrue(combo.isEditable()) 55 56 signal_spy = QSignalSpy(combo.bandChanged) 57 combo.setBand(11111) 58 self.assertEqual(len(signal_spy), 1) 59 self.assertEqual(signal_spy[-1][0], 11111) 60 self.assertEqual(combo.currentBand(), 11111) 61 combo.setBand(-11111) 62 self.assertEqual(combo.currentBand(), -1) 63 self.assertEqual(len(signal_spy), 2) 64 self.assertEqual(signal_spy[-1][0], -1) 65 66 # replace with valid layer 67 path = os.path.join(unitTestDataPath('raster'), 68 'band3_float32_noct_epsg4326.tif') 69 info = QFileInfo(path) 70 base_name = info.baseName() 71 layer2 = QgsRasterLayer(path, base_name) 72 self.assertTrue(layer2.isValid()) 73 74 combo.setBand(2) 75 self.assertEqual(combo.currentBand(), 2) 76 self.assertEqual(len(signal_spy), 3) 77 self.assertEqual(signal_spy[-1][0], 2) 78 combo.setLayer(layer2) 79 self.assertEqual(combo.count(), 3) 80 self.assertFalse(combo.isEditable()) 81 self.assertEqual(combo.currentBand(), 2) 82 self.assertEqual(len(signal_spy), 3) 83 84 # back to invalid 85 combo.setLayer(layer) 86 self.assertEqual(combo.count(), 0) 87 self.assertTrue(combo.isEditable()) 88 self.assertEqual(combo.currentBand(), 2) 89 self.assertEqual(len(signal_spy), 3) 90 91 # with not set option 92 combo.setShowNotSetOption(True) 93 combo.setBand(-1) 94 self.assertEqual(combo.currentBand(), -1) 95 self.assertEqual(len(signal_spy), 4) 96 self.assertEqual(signal_spy[-1][0], -1) 97 combo.setBand(3) 98 self.assertEqual(combo.currentBand(), 3) 99 self.assertEqual(len(signal_spy), 5) 100 self.assertEqual(signal_spy[-1][0], 3) 101 combo.setBand(-1) 102 self.assertEqual(combo.currentBand(), -1) 103 self.assertEqual(len(signal_spy), 6) 104 self.assertEqual(signal_spy[-1][0], -1) 105 106 combo.setLayer(layer2) 107 self.assertEqual(combo.currentBand(), -1) 108 self.assertEqual(len(signal_spy), 6) 109 110 combo.setLayer(layer) 111 combo.setCurrentText('bad') 112 self.assertEqual(combo.currentBand(), -1) 113 self.assertEqual(len(signal_spy), 6) 114 self.assertEqual(signal_spy[-1][0], -1) 115 combo.setCurrentText('5') 116 self.assertEqual(combo.currentBand(), 5) 117 self.assertEqual(len(signal_spy), 7) 118 self.assertEqual(signal_spy[-1][0], 5) 119 combo.setCurrentText('6.5') 120 self.assertEqual(combo.currentBand(), -1) 121 self.assertEqual(len(signal_spy), 8) 122 self.assertEqual(signal_spy[-1][0], -1) 123 combo.setCurrentText('5') 124 self.assertEqual(combo.currentBand(), 5) 125 self.assertEqual(len(signal_spy), 9) 126 self.assertEqual(signal_spy[-1][0], 5) 127 combo.setCurrentText('Not set') 128 self.assertEqual(combo.currentBand(), -1) 129 self.assertEqual(len(signal_spy), 10) 130 self.assertEqual(signal_spy[-1][0], -1) 131 132 def testOneBandRaster(self): 133 path = os.path.join(unitTestDataPath('raster'), 134 'band1_float32_noct_epsg4326.tif') 135 info = QFileInfo(path) 136 base_name = info.baseName() 137 layer = QgsRasterLayer(path, base_name) 138 self.assertTrue(layer) 139 140 combo = QgsRasterBandComboBox() 141 combo.setLayer(layer) 142 self.assertEqual(combo.layer(), layer) 143 self.assertEqual(combo.currentBand(), 1) 144 self.assertEqual(combo.count(), 1) 145 146 combo.setShowNotSetOption(True) 147 self.assertEqual(combo.currentBand(), 1) 148 self.assertEqual(combo.count(), 2) 149 combo.setBand(-1) 150 self.assertEqual(combo.currentBand(), -1) 151 combo.setBand(1) 152 self.assertEqual(combo.currentBand(), 1) 153 154 combo.setShowNotSetOption(False) 155 self.assertEqual(combo.currentBand(), 1) 156 self.assertEqual(combo.count(), 1) 157 158 def testMultiBandRaster(self): 159 path = os.path.join(unitTestDataPath('raster'), 160 'band3_float32_noct_epsg4326.tif') 161 info = QFileInfo(path) 162 base_name = info.baseName() 163 layer = QgsRasterLayer(path, base_name) 164 self.assertTrue(layer) 165 166 combo = QgsRasterBandComboBox() 167 combo.setLayer(layer) 168 self.assertEqual(combo.layer(), layer) 169 self.assertEqual(combo.currentBand(), 1) 170 self.assertEqual(combo.count(), 3) 171 combo.setBand(2) 172 self.assertEqual(combo.currentBand(), 2) 173 174 combo.setShowNotSetOption(True) 175 self.assertEqual(combo.currentBand(), 2) 176 self.assertEqual(combo.count(), 4) 177 178 combo.setShowNotSetOption(False) 179 self.assertEqual(combo.currentBand(), 2) 180 self.assertEqual(combo.count(), 3) 181 182 def testSignals(self): 183 path = os.path.join(unitTestDataPath('raster'), 184 'band3_float32_noct_epsg4326.tif') 185 info = QFileInfo(path) 186 base_name = info.baseName() 187 layer = QgsRasterLayer(path, base_name) 188 self.assertTrue(layer) 189 190 combo = QgsRasterBandComboBox() 191 combo.setLayer(layer) 192 193 signal_spy = QSignalSpy(combo.bandChanged) 194 combo.setBand(2) 195 self.assertEqual(len(signal_spy), 1) 196 self.assertEqual(signal_spy[0][0], 2) 197 combo.setBand(3) 198 self.assertEqual(len(signal_spy), 2) 199 self.assertEqual(signal_spy[1][0], 3) 200 201 202if __name__ == '__main__': 203 unittest.main() 204