/tests/src/python/test_qgsmaplayerproxymodel.py

https://github.com/ricardogsilva/Quantum-GIS · Python · 331 lines · 265 code · 52 blank · 14 comment · 0 complexity · 5dae6166c71dd172fd080a059a654862 MD5 · raw file

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