/qt/widgets/common/test/DataProcessorUI/QOneLevelTreeModelTest.h

https://github.com/mantidproject/mantid · C Header · 252 lines · 166 code · 48 blank · 38 comment · 0 complexity · 5ab4c5054ed3cd7b7cb7f6beb6baddbc MD5 · raw file

  1. // Mantid Repository : https://github.com/mantidproject/mantid
  2. //
  3. // Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
  4. // NScD Oak Ridge National Laboratory, European Spallation Source,
  5. // Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
  6. // SPDX - License - Identifier: GPL - 3.0 +
  7. #pragma once
  8. #include "MantidAPI/ITableWorkspace.h"
  9. #include "MantidAPI/TableRow.h"
  10. #include "MantidAPI/WorkspaceFactory.h"
  11. #include "MantidQtWidgets/Common/DataProcessorUI/QOneLevelTreeModel.h"
  12. #include <cxxtest/TestSuite.h>
  13. using namespace MantidQt::MantidWidgets;
  14. using namespace MantidQt::MantidWidgets::DataProcessor;
  15. using namespace Mantid::API;
  16. class QOneLevelTreeModelTest : public CxxTest::TestSuite {
  17. public:
  18. // This means the constructor isn't called when running other tests
  19. static QOneLevelTreeModelTest *createSuite() { return new QOneLevelTreeModelTest(); }
  20. static void destroySuite(QOneLevelTreeModelTest *suite) { delete suite; }
  21. // Create a white list
  22. QOneLevelTreeModelTest() {
  23. m_whitelist.addElement("Column1", "Property1", "Description1");
  24. m_whitelist.addElement("Column2", "Property2", "Description2");
  25. }
  26. // Create a table ws with one row
  27. ITableWorkspace_sptr oneRowTable() {
  28. ITableWorkspace_sptr ws = WorkspaceFactory::Instance().createTable();
  29. ws->addColumn("str", "Column1");
  30. ws->addColumn("str", "Column2");
  31. TableRow row = ws->appendRow();
  32. row << "row0_col0"
  33. << "row0_col1";
  34. return ws;
  35. }
  36. // Create a table ws with four rows
  37. ITableWorkspace_sptr fourRowTable() {
  38. ITableWorkspace_sptr ws = WorkspaceFactory::Instance().createTable();
  39. ws->addColumn("str", "Column1");
  40. ws->addColumn("str", "Column2");
  41. TableRow row = ws->appendRow();
  42. row << "row0_col0"
  43. << "row0_col1";
  44. row = ws->appendRow();
  45. row << "row1_col0"
  46. << "row1_col1";
  47. row = ws->appendRow();
  48. row << "row2_col0"
  49. << "row2_col1";
  50. row = ws->appendRow();
  51. row << "row3_col0"
  52. << "row3_col1";
  53. return ws;
  54. }
  55. void testBadTableWorkspace() {
  56. auto ws = oneRowTable();
  57. ws->addColumn("str", "Group");
  58. TS_ASSERT_THROWS(QOneLevelTreeModel(ws, m_whitelist), const std::invalid_argument &);
  59. ws->addColumn("str", "Group1");
  60. ws->addColumn("str", "Group2");
  61. TS_ASSERT_THROWS(QOneLevelTreeModel(ws, m_whitelist), const std::invalid_argument &);
  62. }
  63. void testConstructorOneRowTable() {
  64. auto ws = oneRowTable();
  65. QOneLevelTreeModel model(ws, m_whitelist);
  66. // One row
  67. TS_ASSERT_EQUALS(model.rowCount(), 1);
  68. // Two columns
  69. TS_ASSERT_EQUALS(model.columnCount(), 2);
  70. // Test data
  71. TS_ASSERT_EQUALS(model.data(model.index(0, 0)).toString().toStdString(), "row0_col0");
  72. TS_ASSERT_EQUALS(model.data(model.index(0, 1)).toString().toStdString(), "row0_col1");
  73. // Header data
  74. TS_ASSERT_EQUALS(model.headerData(0, Qt::Horizontal, Qt::DisplayRole), "Column1");
  75. TS_ASSERT_EQUALS(model.headerData(1, Qt::Horizontal, Qt::DisplayRole), "Column2");
  76. }
  77. void testConstructorFourRowTable() {
  78. auto ws = fourRowTable();
  79. QOneLevelTreeModel model(ws, m_whitelist);
  80. // Four rows
  81. TS_ASSERT_EQUALS(model.rowCount(), 4);
  82. // Two columns
  83. TS_ASSERT_EQUALS(model.columnCount(), 2);
  84. // Test data
  85. TS_ASSERT_EQUALS(model.data(model.index(2, 0)).toString().toStdString(), "row2_col0");
  86. TS_ASSERT_EQUALS(model.data(model.index(2, 1)).toString().toStdString(), "row2_col1");
  87. TS_ASSERT_EQUALS(model.data(model.index(3, 0)).toString().toStdString(), "row3_col0");
  88. TS_ASSERT_EQUALS(model.data(model.index(3, 1)).toString().toStdString(), "row3_col1");
  89. // Header data
  90. TS_ASSERT_EQUALS(model.headerData(0, Qt::Horizontal, Qt::DisplayRole), "Column1");
  91. TS_ASSERT_EQUALS(model.headerData(1, Qt::Horizontal, Qt::DisplayRole), "Column2");
  92. }
  93. void testColumnCount() {
  94. auto ws = oneRowTable();
  95. QOneLevelTreeModel model(ws, m_whitelist);
  96. TS_ASSERT_EQUALS(model.columnCount(), m_whitelist.size());
  97. }
  98. void testIndex() {
  99. auto ws = fourRowTable();
  100. QOneLevelTreeModel model(ws, m_whitelist);
  101. TS_ASSERT_EQUALS(model.index(0, 0).row(), 0);
  102. TS_ASSERT_EQUALS(model.index(1, 0).row(), 1);
  103. TS_ASSERT_EQUALS(model.index(2, 0).row(), 2);
  104. TS_ASSERT_EQUALS(model.index(3, 0).row(), 3);
  105. }
  106. void testParent() {
  107. auto ws = fourRowTable();
  108. QOneLevelTreeModel model(ws, m_whitelist);
  109. TS_ASSERT_EQUALS(model.parent(model.index(0, 0)), QModelIndex());
  110. TS_ASSERT_EQUALS(model.parent(model.index(1, 0)), QModelIndex());
  111. TS_ASSERT_EQUALS(model.parent(model.index(2, 0)), QModelIndex());
  112. TS_ASSERT_EQUALS(model.parent(model.index(3, 0)), QModelIndex());
  113. }
  114. void testSetData() {
  115. auto ws = fourRowTable();
  116. QOneLevelTreeModel model(ws, m_whitelist);
  117. // Update some cells with new data
  118. model.setData(model.index(0, 0), "new_value1");
  119. model.setData(model.index(1, 1), "new_value2");
  120. model.setData(model.index(2, 1), "new_value3");
  121. // Test data
  122. TS_ASSERT_EQUALS(model.data(model.index(0, 0)).toString().toStdString(), "new_value1");
  123. TS_ASSERT_EQUALS(model.data(model.index(0, 1)).toString().toStdString(), "row0_col1");
  124. TS_ASSERT_EQUALS(model.data(model.index(1, 0)).toString().toStdString(), "row1_col0");
  125. TS_ASSERT_EQUALS(model.data(model.index(1, 1)).toString().toStdString(), "new_value2");
  126. TS_ASSERT_EQUALS(model.data(model.index(2, 0)).toString().toStdString(), "row2_col0");
  127. TS_ASSERT_EQUALS(model.data(model.index(2, 1)).toString().toStdString(), "new_value3");
  128. TS_ASSERT_EQUALS(model.data(model.index(3, 0)).toString().toStdString(), "row3_col0");
  129. TS_ASSERT_EQUALS(model.data(model.index(3, 1)).toString().toStdString(), "row3_col1");
  130. }
  131. void testInsertRowsOneRowTable() {
  132. auto ws = oneRowTable();
  133. QOneLevelTreeModel model(ws, m_whitelist);
  134. // Insert rows
  135. // Invalid position
  136. TS_ASSERT_EQUALS(model.insertRows(2, 1), false);
  137. // Tree dimensions didn't change
  138. TS_ASSERT_EQUALS(model.rowCount(), 1);
  139. // Insert after existing row
  140. TS_ASSERT_EQUALS(model.insertRows(1, 1), true);
  141. // There's one extra row
  142. TS_ASSERT_EQUALS(model.rowCount(), 2);
  143. // Insert two rows at the beginning
  144. TS_ASSERT_EQUALS(model.insertRows(0, 2), true);
  145. // There are two extra row
  146. TS_ASSERT_EQUALS(model.rowCount(), 4);
  147. }
  148. void testRemoveRowsOneRowTable() {
  149. auto ws = oneRowTable();
  150. QOneLevelTreeModel model(ws, m_whitelist);
  151. // Remove the only row
  152. TS_ASSERT_EQUALS(model.removeRows(0, 1), true);
  153. TS_ASSERT_EQUALS(model.rowCount(), 0);
  154. // We should be able to add new rows back
  155. TS_ASSERT_EQUALS(model.insertRows(0, 1), true);
  156. TS_ASSERT_EQUALS(model.rowCount(), 1);
  157. }
  158. void testRemoveRowsFourRowTable() {
  159. auto ws = fourRowTable();
  160. QOneLevelTreeModel model(ws, m_whitelist);
  161. // Non-existing row
  162. TS_ASSERT_EQUALS(model.removeRows(10, 1), false);
  163. TS_ASSERT_EQUALS(model.removeRows(-1, 1), false);
  164. TS_ASSERT_EQUALS(model.rowCount(), 4);
  165. // More rows than current number of rows
  166. TS_ASSERT_EQUALS(model.removeRows(1, 50), false);
  167. TS_ASSERT_EQUALS(model.rowCount(), 4);
  168. // Remove last row
  169. TS_ASSERT_EQUALS(model.removeRows(3, 1), true);
  170. TS_ASSERT_EQUALS(model.rowCount(), 3);
  171. }
  172. void testHighlightFourRowTable() {
  173. auto ws = fourRowTable();
  174. QOneLevelTreeModel model(ws, m_whitelist);
  175. // Non-existent row
  176. TS_ASSERT_EQUALS(model.setProcessed(true, 10), false);
  177. TS_ASSERT_EQUALS(model.setProcessed(true, -1), false);
  178. // Set the 1st and 3rd rows processed
  179. TS_ASSERT_EQUALS(model.setProcessed(true, 0), true);
  180. TS_ASSERT_EQUALS(model.setProcessed(true, 2), true);
  181. // Only 1st and 3rd rows are highlighted
  182. TS_ASSERT_EQUALS(model.data(model.index(0, 0), Qt::BackgroundRole).toString().toStdString(), Colour::SUCCESS);
  183. TS_ASSERT_EQUALS(model.data(model.index(1, 0), Qt::BackgroundRole).toString().toStdString(), "");
  184. TS_ASSERT_EQUALS(model.data(model.index(2, 0), Qt::BackgroundRole).toString().toStdString(), Colour::SUCCESS);
  185. TS_ASSERT_EQUALS(model.data(model.index(3, 0), Qt::BackgroundRole).toString().toStdString(), "");
  186. }
  187. void testIsProcessedFourRowTable() {
  188. auto ws = fourRowTable();
  189. QOneLevelTreeModel model(ws, m_whitelist);
  190. // Set the 1st and 3rd rows processed
  191. model.setProcessed(true, 0);
  192. model.setProcessed(true, 2);
  193. // Non-existent row
  194. TS_ASSERT_THROWS(model.isProcessed(10), const std::invalid_argument &);
  195. TS_ASSERT_THROWS(model.isProcessed(-1), const std::invalid_argument &);
  196. // Only 1st and 3rd rows are processed
  197. TS_ASSERT_EQUALS(model.isProcessed(0), true);
  198. TS_ASSERT_EQUALS(model.isProcessed(1), false);
  199. TS_ASSERT_EQUALS(model.isProcessed(2), true);
  200. TS_ASSERT_EQUALS(model.isProcessed(3), false);
  201. }
  202. private:
  203. WhiteList m_whitelist;
  204. };