1# -*- coding: utf-8 -*- 2"""QGIS Unit tests for QgsMapLayerProxyModel 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__ = '22/08/2018' 11__copyright__ = 'Copyright 2018, The QGIS Project' 12 13import qgis # NOQA 14 15from qgis.core import QgsVectorLayer, QgsMeshLayer, QgsProject, QgsMapLayerModel, QgsMapLayerProxyModel 16from qgis.PyQt.QtCore import Qt, QModelIndex 17 18from qgis.testing import start_app, unittest 19 20start_app() 21 22 23def create_layer(name): 24 layer = QgsVectorLayer("Point?crs=EPSG:3111&field=fldtxt:string&field=fldint:integer", 25 name, "memory") 26 return layer 27 28 29def create_mesh_layer(name): 30 layer = QgsMeshLayer("1.0, 2.0\n2.0, 2.0\n3.0, 2.0\n---\n0, 1, 3", name, "mesh_memory") 31 return layer 32 33 34class TestQgsMapLayerProxyModel(unittest.TestCase): 35 36 def testGettersSetters(self): 37 """ test model getters/setters """ 38 m = QgsMapLayerProxyModel() 39 l1 = create_layer('l1') 40 QgsProject.instance().addMapLayer(l1) 41 l2 = create_layer('l2') 42 QgsProject.instance().addMapLayer(l2) 43 44 m.setFilters(QgsMapLayerProxyModel.LineLayer | QgsMapLayerProxyModel.WritableLayer) 45 self.assertEqual(m.filters(), QgsMapLayerProxyModel.LineLayer | QgsMapLayerProxyModel.WritableLayer) 46 47 m.setExceptedLayerIds([l2.id()]) 48 self.assertEqual(m.exceptedLayerIds(), [l2.id()]) 49 50 m.setExceptedLayerList([l2]) 51 self.assertEqual(m.exceptedLayerList(), [l2]) 52 53 m.setLayerAllowlist([l2]) 54 self.assertEqual(m.layerAllowlist(), [l2]) 55 56 m.setExcludedProviders(['a', 'b']) 57 self.assertEqual(m.excludedProviders(), ['a', 'b']) 58 59 m.setFilterString('c') 60 self.assertEqual(m.filterString(), 'c') 61 62 def testMeshLayer(self): 63 m = QgsMapLayerProxyModel() 64 l1 = create_mesh_layer("l1") 65 QgsProject.instance().addMapLayer(l1) 66 l2 = create_layer('l2') 67 QgsProject.instance().addMapLayer(l2) 68 69 m.setFilters(QgsMapLayerProxyModel.MeshLayer) 70 self.assertEqual(m.filters(), QgsMapLayerProxyModel.MeshLayer) 71 72 self.assertEqual(m.rowCount(), 1) 73 self.assertEqual(m.data(m.index(0, 0)), 'l1') 74 75 self.assertTrue(m.acceptsLayer(l1)) 76 self.assertFalse(m.acceptsLayer(l2)) 77 78 def testFilterGeometryType(self): 79 """ test filtering by geometry type """ 80 QgsProject.instance().clear() 81 m = QgsMapLayerProxyModel() 82 l1 = QgsVectorLayer("Point?crs=EPSG:3111&field=fldtxt:string&field=fldint:integer", 83 'layer 1', "memory") 84 QgsProject.instance().addMapLayer(l1) 85 l2 = QgsVectorLayer("Polygon?crs=EPSG:3111&field=fldtxt:string&field=fldint:integer", 86 'layer 2', "memory") 87 QgsProject.instance().addMapLayer(l2) 88 l3 = QgsVectorLayer("None?field=fldtxt:string&field=fldint:integer", 89 'layer 3', "memory") 90 QgsProject.instance().addMapLayer(l3) 91 l4 = QgsVectorLayer("LineString?crs=EPSG:3111&field=fldtxt:string&field=fldint:integer", 92 'layer 4', "memory") 93 QgsProject.instance().addMapLayer(l4) 94 95 m.setFilters(QgsMapLayerProxyModel.PolygonLayer) 96 self.assertEqual(m.rowCount(), 1) 97 self.assertEqual(m.data(m.index(0, 0)), 'layer 2') 98 99 self.assertFalse(m.acceptsLayer(l1)) 100 self.assertTrue(m.acceptsLayer(l2)) 101 self.assertFalse(m.acceptsLayer(l3)) 102 self.assertFalse(m.acceptsLayer(l4)) 103 104 m.setFilters(QgsMapLayerProxyModel.PointLayer) 105 self.assertEqual(m.rowCount(), 1) 106 self.assertEqual(m.data(m.index(0, 0)), 'layer 1') 107 108 self.assertTrue(m.acceptsLayer(l1)) 109 self.assertFalse(m.acceptsLayer(l2)) 110 self.assertFalse(m.acceptsLayer(l3)) 111 self.assertFalse(m.acceptsLayer(l4)) 112 113 m.setFilters(QgsMapLayerProxyModel.LineLayer) 114 self.assertEqual(m.rowCount(), 1) 115 self.assertEqual(m.data(m.index(0, 0)), 'layer 4') 116 117 self.assertFalse(m.acceptsLayer(l1)) 118 self.assertFalse(m.acceptsLayer(l2)) 119 self.assertFalse(m.acceptsLayer(l3)) 120 self.assertTrue(m.acceptsLayer(l4)) 121 122 m.setFilters(QgsMapLayerProxyModel.NoGeometry) 123 self.assertEqual(m.rowCount(), 1) 124 self.assertEqual(m.data(m.index(0, 0)), 'layer 3') 125 126 self.assertFalse(m.acceptsLayer(l1)) 127 self.assertFalse(m.acceptsLayer(l2)) 128 self.assertTrue(m.acceptsLayer(l3)) 129 self.assertFalse(m.acceptsLayer(l4)) 130 131 m.setFilters(QgsMapLayerProxyModel.HasGeometry) 132 self.assertEqual(m.rowCount(), 3) 133 self.assertEqual(m.data(m.index(0, 0)), 'layer 1') 134 self.assertEqual(m.data(m.index(1, 0)), 'layer 2') 135 self.assertEqual(m.data(m.index(2, 0)), 'layer 4') 136 137 self.assertTrue(m.acceptsLayer(l1)) 138 self.assertTrue(m.acceptsLayer(l2)) 139 self.assertFalse(m.acceptsLayer(l3)) 140 self.assertTrue(m.acceptsLayer(l4)) 141 142 m.setFilters(QgsMapLayerProxyModel.VectorLayer) 143 self.assertEqual(m.rowCount(), 4) 144 self.assertEqual(m.data(m.index(0, 0)), 'layer 1') 145 self.assertEqual(m.data(m.index(1, 0)), 'layer 2') 146 self.assertEqual(m.data(m.index(2, 0)), 'layer 3') 147 self.assertEqual(m.data(m.index(3, 0)), 'layer 4') 148 149 self.assertTrue(m.acceptsLayer(l1)) 150 self.assertTrue(m.acceptsLayer(l2)) 151 self.assertTrue(m.acceptsLayer(l3)) 152 self.assertTrue(m.acceptsLayer(l4)) 153 154 m.setFilters(QgsMapLayerProxyModel.PluginLayer) 155 self.assertEqual(m.rowCount(), 0) 156 157 self.assertFalse(m.acceptsLayer(l1)) 158 self.assertFalse(m.acceptsLayer(l2)) 159 self.assertFalse(m.acceptsLayer(l3)) 160 self.assertFalse(m.acceptsLayer(l4)) 161 162 m.setFilters(QgsMapLayerProxyModel.RasterLayer) 163 self.assertEqual(m.rowCount(), 0) 164 165 self.assertFalse(m.acceptsLayer(l1)) 166 self.assertFalse(m.acceptsLayer(l2)) 167 self.assertFalse(m.acceptsLayer(l3)) 168 self.assertFalse(m.acceptsLayer(l4)) 169 170 def testFilterString(self): 171 """ test filtering by string""" 172 QgsProject.instance().clear() 173 m = QgsMapLayerProxyModel() 174 l1 = QgsVectorLayer("Point?crs=EPSG:3111&field=fldtxt:string&field=fldint:integer", 175 'layer 1', "memory") 176 QgsProject.instance().addMapLayer(l1) 177 l2 = QgsVectorLayer("Polygon?crs=EPSG:3111&field=fldtxt:string&field=fldint:integer", 178 'lAyEr 2', "memory") 179 QgsProject.instance().addMapLayer(l2) 180 l3 = QgsVectorLayer("None?field=fldtxt:string&field=fldint:integer", 181 'another', "memory") 182 QgsProject.instance().addMapLayer(l3) 183 l4 = QgsVectorLayer("LineString?crs=EPSG:3111&field=fldtxt:string&field=fldint:integer", 184 'final layer', "memory") 185 QgsProject.instance().addMapLayer(l4) 186 187 m.setFilterString('layer') 188 self.assertEqual(m.rowCount(), 3) 189 self.assertEqual(m.data(m.index(0, 0)), 'final layer') 190 self.assertEqual(m.data(m.index(1, 0)), 'layer 1') 191 self.assertEqual(m.data(m.index(2, 0)), 'lAyEr 2') 192 193 self.assertTrue(m.acceptsLayer(l1)) 194 self.assertTrue(m.acceptsLayer(l2)) 195 self.assertFalse(m.acceptsLayer(l3)) 196 self.assertTrue(m.acceptsLayer(l4)) 197 198 m.setFilterString('') 199 self.assertEqual(m.rowCount(), 4) 200 201 def testFilterByLayer(self): 202 """ test filtering by layer""" 203 QgsProject.instance().clear() 204 m = QgsMapLayerProxyModel() 205 l1 = QgsVectorLayer("Point?crs=EPSG:3111&field=fldtxt:string&field=fldint:integer", 206 'layer 1', "memory") 207 QgsProject.instance().addMapLayer(l1) 208 l2 = QgsVectorLayer("Polygon?crs=EPSG:3111&field=fldtxt:string&field=fldint:integer", 209 'lAyEr 2', "memory") 210 QgsProject.instance().addMapLayer(l2) 211 l3 = QgsVectorLayer("None?field=fldtxt:string&field=fldint:integer", 212 'another', "memory") 213 QgsProject.instance().addMapLayer(l3) 214 l4 = QgsVectorLayer("LineString?crs=EPSG:3111&field=fldtxt:string&field=fldint:integer", 215 'final layer', "memory") 216 QgsProject.instance().addMapLayer(l4) 217 218 self.assertEqual(m.rowCount(), 4) 219 self.assertEqual(m.data(m.index(0, 0)), 'another') 220 self.assertEqual(m.data(m.index(1, 0)), 'final layer') 221 self.assertEqual(m.data(m.index(2, 0)), 'layer 1') 222 self.assertEqual(m.data(m.index(3, 0)), 'lAyEr 2') 223 224 self.assertTrue(m.acceptsLayer(l1)) 225 self.assertTrue(m.acceptsLayer(l2)) 226 self.assertTrue(m.acceptsLayer(l3)) 227 self.assertTrue(m.acceptsLayer(l4)) 228 229 m.setExceptedLayerList([l1, l3]) 230 self.assertEqual(m.rowCount(), 2) 231 self.assertEqual(m.data(m.index(0, 0)), 'final layer') 232 self.assertEqual(m.data(m.index(1, 0)), 'lAyEr 2') 233 234 self.assertFalse(m.acceptsLayer(l1)) 235 self.assertTrue(m.acceptsLayer(l2)) 236 self.assertFalse(m.acceptsLayer(l3)) 237 self.assertTrue(m.acceptsLayer(l4)) 238 239 m.setExceptedLayerIds([l2.id(), l4.id()]) 240 self.assertEqual(m.rowCount(), 2) 241 self.assertEqual(m.data(m.index(0, 0)), 'another') 242 self.assertEqual(m.data(m.index(1, 0)), 'layer 1') 243 244 self.assertTrue(m.acceptsLayer(l1)) 245 self.assertFalse(m.acceptsLayer(l2)) 246 self.assertTrue(m.acceptsLayer(l3)) 247 self.assertFalse(m.acceptsLayer(l4)) 248 249 m.setLayerAllowlist([l1]) 250 self.assertEqual(m.rowCount(), 1) 251 self.assertEqual(m.data(m.index(0, 0)), 'layer 1') 252 253 self.assertTrue(m.acceptsLayer(l1)) 254 self.assertFalse(m.acceptsLayer(l2)) 255 self.assertFalse(m.acceptsLayer(l3)) 256 self.assertFalse(m.acceptsLayer(l4)) 257 258 m.setExceptedLayerIds([]) 259 self.assertEqual(m.rowCount(), 1) 260 self.assertEqual(m.data(m.index(0, 0)), 'layer 1') 261 262 self.assertTrue(m.acceptsLayer(l1)) 263 self.assertFalse(m.acceptsLayer(l2)) 264 self.assertFalse(m.acceptsLayer(l3)) 265 self.assertFalse(m.acceptsLayer(l4)) 266 267 m.setLayerAllowlist([l2, l3]) 268 self.assertEqual(m.rowCount(), 2) 269 self.assertEqual(m.data(m.index(0, 0)), 'another') 270 self.assertEqual(m.data(m.index(1, 0)), 'lAyEr 2') 271 272 self.assertFalse(m.acceptsLayer(l1)) 273 self.assertTrue(m.acceptsLayer(l2)) 274 self.assertTrue(m.acceptsLayer(l3)) 275 self.assertFalse(m.acceptsLayer(l4)) 276 277 m.setLayerAllowlist([]) 278 self.assertEqual(m.rowCount(), 4) 279 280 self.assertTrue(m.acceptsLayer(l1)) 281 self.assertTrue(m.acceptsLayer(l2)) 282 self.assertTrue(m.acceptsLayer(l3)) 283 self.assertTrue(m.acceptsLayer(l4)) 284 285 286if __name__ == '__main__': 287 unittest.main() 288