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