ctkFlatProxyModelTest.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. /*=========================================================================
  2. Library: CTK
  3. Copyright (c) Kitware Inc.
  4. Licensed under the Apache License, Version 2.0 (the "License");
  5. you may not use this file except in compliance with the License.
  6. You may obtain a copy of the License at
  7. http://www.apache.org/licenses/LICENSE-2.0.txt
  8. Unless required by applicable law or agreed to in writing, software
  9. distributed under the License is distributed on an "AS IS" BASIS,
  10. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. See the License for the specific language governing permissions and
  12. limitations under the License.
  13. =========================================================================*/
  14. // Qt includes
  15. #include <QDebug>
  16. #include <QApplication>
  17. #include <QEventLoop>
  18. #include <QTreeView>
  19. #include <QStandardItem>
  20. #include <QStandardItemModel>
  21. #include <QTimer>
  22. // CTK includes
  23. #include "ctkFlatProxyModel.h"
  24. #include "ctkModelTester.h"
  25. #include "ctkTest.h"
  26. #if QT_VERSION < 0x040700
  27. Q_DECLARE_METATYPE(QVariant)
  28. #endif
  29. // ----------------------------------------------------------------------------
  30. class ctkFlatProxyModelTester: public QObject
  31. {
  32. Q_OBJECT
  33. private slots:
  34. void testModel();
  35. void testModel_data();
  36. private:
  37. QStandardItem* createItem(const QString& name, QVariant& children)const;
  38. };
  39. // ----------------------------------------------------------------------------
  40. void ctkFlatProxyModelTester::testModel_data()
  41. {
  42. QTest::addColumn<QVariant >("hashModel");
  43. QTest::addColumn<int>("startHideLevel");
  44. QTest::addColumn<int>("endFlattenLevel");
  45. QTest::addColumn<int>("level0ExpectedRowCount");
  46. QTest::addColumn<int>("level1ExpectedRowCount");
  47. // -\ top
  48. // +--\ item1
  49. // | +--\ subItem1
  50. // | | +--\ subSubItem1
  51. // | | | +-- leaf1
  52. // | | +--\ subSubItem2
  53. // | | | +-- leaf2
  54. // | | +--\ subSubItem3
  55. // | | +-- leaf3
  56. // | +--\ subItem2
  57. // | | +--\ subSubItem1
  58. // | | | +-- leaf1
  59. // | | +--\ subSubItem2
  60. // | | | +-- leaf2
  61. // | | +--\ subSubItem3
  62. // | | +-- leaf3
  63. // | +--\ subItem3
  64. // | +--\ subSubItem1
  65. // | | +-- leaf1
  66. // | +--\ subSubItem2
  67. // | | +-- leaf2
  68. // | +--\ subSubItem3
  69. // | +-- leaf3
  70. // +--\ item2
  71. // | +--\ subItem1
  72. // | | +--\ subSubItem1
  73. // | | | +-- leaf1
  74. // | | +--\ subSubItem2
  75. // | | | +-- leaf2
  76. // | | +--\ subSubItem3
  77. // | | +-- leaf3
  78. // | +--\ subItem2
  79. // | | +--\ subSubItem1
  80. // | | | +-- leaf1
  81. // | | +--\ subSubItem2
  82. // | | | +-- leaf2
  83. // | | +--\ subSubItem3
  84. // | | +-- leaf3
  85. // | +--\ subItem3
  86. // | +--\ subSubItem1
  87. // | | +-- leaf1
  88. // | +--\ subSubItem2
  89. // | | +-- leaf2
  90. // | +--\ subSubItem3
  91. // | +-- leaf3
  92. // +--\ item3
  93. // +--\ subItem1
  94. // | +--\ subSubItem1
  95. // | | +-- leaf1
  96. // | +--\ subSubItem2
  97. // | | +-- leaf2
  98. // | +--\ subSubItem3
  99. // | +-- leaf3
  100. // +--\ subItem2
  101. // | +--\ subSubItem1
  102. // | | +-- leaf1
  103. // | +--\ subSubItem2
  104. // | | +-- leaf2
  105. // | +--\ subSubItem3
  106. // | +-- leaf3
  107. // +--\ subItem3
  108. // +--\ subSubItem1
  109. // | +-- leaf1
  110. // +--\ subSubItem2
  111. // | +-- leaf2
  112. // +--\ subSubItem3
  113. // +-- leaf3
  114. QMap<QString, QVariant> subSubModel;
  115. subSubModel["subSubItem1"] = QString("leaf1");
  116. subSubModel["subSubItem2"] = QString("leaf2");
  117. QMap<QString, QVariant> subModel;
  118. subModel["subItem1"] = subSubModel;
  119. subModel["subItem2"] = subSubModel;
  120. subModel["subItem3"] = subSubModel;
  121. QMap<QString, QVariant> model;
  122. model["item1"] = subModel;
  123. model["item2"] = subModel;
  124. model["item3"] = subModel;
  125. model["item4"] = subModel;
  126. // -\ top
  127. // +--\ subItem1 (item1)
  128. // | +--\ subSubItem1
  129. // | | +-- leaf1
  130. // | +--\ subSubItem2
  131. // | | +-- leaf2
  132. // | +--\ subSubItem3
  133. // | +-- leaf3
  134. // +--\ subItem2 (item1)
  135. // | +--\ subSubItem1
  136. // | | +-- leaf1
  137. // | +--\ subSubItem2
  138. // | | +-- leaf2
  139. // | +--\ subSubItem3
  140. // | +-- leaf3
  141. // +--\ subItem3 (item1)
  142. // | +--\ subSubItem1
  143. // | | +-- leaf1
  144. // | +--\ subSubItem2
  145. // | | +-- leaf2
  146. // | +--\ subSubItem3
  147. // | +-- leaf3
  148. // +--\ subItem1 (item2)
  149. // | +--\ subSubItem1
  150. // | | +-- leaf1
  151. // | +--\ subSubItem2
  152. // | | +-- leaf2
  153. // | +--\ subSubItem3
  154. // | +-- leaf3
  155. // +--\ subItem2 (item2)
  156. // | +--\ subSubItem1
  157. // | | +-- leaf1
  158. // | +--\ subSubItem2
  159. // | | +-- leaf2
  160. // | +--\ subSubItem3
  161. // | +-- leaf3
  162. // +--\ subItem3 (item2)
  163. // | +--\ subSubItem1
  164. // | | +-- leaf1
  165. // | +--\ subSubItem2
  166. // | | +-- leaf2
  167. // | +--\ subSubItem3
  168. // | +-- leaf3
  169. // +--\ subItem1 (item3)
  170. // | +--\ subSubItem1
  171. // | | +-- leaf1
  172. // | +--\ subSubItem2
  173. // | | +-- leaf2
  174. // | +--\ subSubItem3
  175. // | +-- leaf3
  176. // +--\ subItem2 (item3)
  177. // | +--\ subSubItem1
  178. // | | +-- leaf1
  179. // | +--\ subSubItem2
  180. // | | +-- leaf2
  181. // | +--\ subSubItem3
  182. // | +-- leaf3
  183. // +--\ subItem3 (item3)
  184. // +--\ subSubItem1
  185. // | +-- leaf1
  186. // +--\ subSubItem2
  187. // | +-- leaf2
  188. // +--\ subSubItem3
  189. // +-- leaf3
  190. QTest::newRow("flatten level 0") << QVariant(model) << -1 << 0 << 12 << 2;
  191. // Don't work yet.
  192. //QTest::newRow("flatten level 1") << QVariant(model) << -1<< 1 << 24 << 1;
  193. //QTest::newRow("flatten level 0, hide 2") << QVariant(model) << 0 << 0 << 12 << 2;
  194. //QTest::newRow("flatten level 1, hide 2") << QVariant(model) << 0 << 1 << 12 << 2;
  195. }
  196. // ----------------------------------------------------------------------------
  197. QStandardItem* ctkFlatProxyModelTester
  198. ::createItem(const QString& name, QVariant& children)const
  199. {
  200. QStandardItem* item = new QStandardItem(name);
  201. if (children.canConvert<QString>())
  202. {
  203. QStandardItem* leaf = new QStandardItem(children.toString());
  204. item->appendRow(leaf);
  205. return item;
  206. }
  207. QMap<QString, QVariant> hash = children.toMap();
  208. QMap<QString, QVariant>::iterator i = hash.begin();
  209. for ( ; i != hash.end(); ++i)
  210. {
  211. QStandardItem* childItem = this->createItem(i.key(), i.value());
  212. item->appendRow(childItem);
  213. }
  214. return item;
  215. }
  216. // ----------------------------------------------------------------------------
  217. void ctkFlatProxyModelTester::testModel()
  218. {
  219. QStandardItemModel model;
  220. QFETCH(QVariant, hashModel);
  221. QFETCH(int, endFlattenLevel);
  222. QFETCH(int, startHideLevel);
  223. QFETCH(int, level0ExpectedRowCount);
  224. QFETCH(int, level1ExpectedRowCount);
  225. QMap<QString, QVariant> hash = hashModel.toMap();
  226. QMap<QString, QVariant>::iterator i = hash.begin();
  227. for ( ; i != hash.end(); ++i)
  228. {
  229. QStandardItem* childItem = this->createItem(i.key(), i.value());
  230. model.appendRow(childItem);
  231. }
  232. ctkFlatProxyModel flattenModel;
  233. flattenModel.setEndFlattenLevel(endFlattenLevel);
  234. flattenModel.setHideLevel(startHideLevel);
  235. flattenModel.setSourceModel(&model);
  236. QCOMPARE( flattenModel.rowCount(QModelIndex()), level0ExpectedRowCount);
  237. QModelIndex subIndex1 = flattenModel.index(0,0, QModelIndex());
  238. QCOMPARE( flattenModel.rowCount(subIndex1), level1ExpectedRowCount);
  239. ctkModelTester tester;
  240. tester.setTestDataEnabled(false);
  241. tester.setModel(&flattenModel);
  242. /*
  243. QTreeView view(0);
  244. view.setModel(&flattenModel);
  245. view.show();
  246. QEventLoop eventLoop;
  247. eventLoop.exec();
  248. */
  249. }
  250. // ----------------------------------------------------------------------------
  251. CTK_TEST_MAIN(ctkFlatProxyModelTest)
  252. #include "moc_ctkFlatProxyModelTest.cpp"