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