/ tests / tst_sorters.qml
tst_sorters.qml
  1  import QtQuick 2.0
  2  import QtQml 2.2
  3  import QtTest 1.1
  4  import SortFilterProxyModel 0.2
  5  import SortFilterProxyModel.Test 0.2
  6  
  7  Item {
  8      ListModel {
  9          id: listModel
 10          ListElement { test: "first"; test2: "c"; test3: 1 }
 11          ListElement { test: "second"; test2: "a"; test3: 0 }
 12          ListElement { test: "third"; test2: "b"; test3: 2}
 13          ListElement { test: "fourth"; test2: "b"; test3: 3 }
 14      }
 15  
 16      ListModel {
 17          id: noRolesFirstListModel
 18      }
 19  
 20      property list<QtObject> sorters: [
 21          QtObject {
 22            property string tag: "no sorter"
 23            property bool notASorter: true
 24            property var expectedValues: ["first", "second", "third", "fourth"]
 25          },
 26          IndexSorter {
 27              property string tag: "Dummy IndexSorter"
 28              property var expectedValues: ["first", "second", "third", "fourth"]
 29          },
 30          ReverseIndexSorter {
 31              property string tag: "Dummy ReverseIndexSorter"
 32              property var expectedValues: ["fourth", "third", "second", "first"]
 33          },
 34          IndexSorter {
 35              property string tag: "Disabled dummy IndexSorter"
 36              enabled: false
 37              property var expectedValues: ["first", "second", "third", "fourth"]
 38          },
 39          ReverseIndexSorter {
 40              property string tag: "Disabled dummy ReverseIndexSorter"
 41              enabled: false
 42              property var expectedValues: ["first", "second", "third", "fourth"]
 43          },
 44          IndexSorter {
 45              property string tag: "Descending dummy IndexSorter"
 46              ascendingOrder: false
 47              property var expectedValues: ["fourth", "third", "second", "first"]
 48          },
 49          ReverseIndexSorter {
 50              property string tag: "Descending dummy ReverseIndexSorter"
 51              ascendingOrder: false
 52              property var expectedValues: ["first", "second", "third", "fourth"]
 53          },
 54          IndexSorter {
 55              property string tag: "Disabled descending dummy IndexSorter"
 56              enabled: false
 57              ascendingOrder: false
 58              property var expectedValues: ["first", "second", "third", "fourth"]
 59          },
 60          ReverseIndexSorter {
 61              property string tag: "Disabled descending dummy ReverseIndexSorter"
 62              enabled: false
 63              ascendingOrder: false
 64              property var expectedValues: ["first", "second", "third", "fourth"]
 65          }
 66      ]
 67  
 68      ReverseIndexSorter {
 69          id: reverseIndexSorter
 70      }
 71  
 72      property list<RoleSorter> tieSorters: [
 73          RoleSorter { roleName: "test2" },
 74          RoleSorter { roleName: "test" }
 75      ]
 76  
 77      property list<RoleSorter> sortersWithPriority: [
 78          RoleSorter { roleName: "test3" },
 79          RoleSorter { roleName: "test" },
 80          RoleSorter { roleName: "test2"; priority: 1 }
 81      ]
 82  
 83      SortFilterProxyModel {
 84          id: testModel
 85          sourceModel: listModel
 86      }
 87  
 88      SortFilterProxyModel {
 89          id: noRolesFirstProxyModel
 90          sourceModel: noRolesFirstListModel
 91          sorters: RoleSorter { roleName: "test" }
 92      }
 93  
 94      TestCase {
 95          name: "SortersTests"
 96  
 97          function test_indexOrder_data() {
 98              return sorters;
 99          }
100  
101          function test_indexOrder(sorter) {
102              testModel.sorters = sorter;
103              verifyModelValues(testModel, sorter.expectedValues);
104          }
105  
106          function test_enablingSorter() {
107              reverseIndexSorter.enabled = false;
108              testModel.sorters = reverseIndexSorter;
109              var expectedValuesBeforeEnabling = ["first", "second", "third", "fourth"];
110              var expectedValuesAfterEnabling = ["fourth", "third", "second", "first"];
111              verifyModelValues(testModel, expectedValuesBeforeEnabling);
112              reverseIndexSorter.enabled = true;
113              verifyModelValues(testModel, expectedValuesAfterEnabling);
114          }
115  
116          function test_disablingSorter() {
117              reverseIndexSorter.enabled = true;
118              testModel.sorters = reverseIndexSorter;
119              var expectedValuesBeforeDisabling = ["fourth", "third", "second", "first"];
120              var expectedValuesAfterDisabling = ["first", "second", "third", "fourth"];
121              verifyModelValues(testModel, expectedValuesBeforeDisabling);
122              reverseIndexSorter.enabled = false;
123              verifyModelValues(testModel, expectedValuesAfterDisabling);
124          }
125  
126          function test_tieSorters() {
127              testModel.sorters = tieSorters;
128              var expectedValues = ["second", "fourth", "third", "first"];
129              verifyModelValues(testModel, expectedValues);
130          }
131  
132          function test_sortersWithPriority() {
133              testModel.sorters = sortersWithPriority;
134              var expectedValues = ["second", "third", "fourth", "first"];
135              verifyModelValues(testModel, expectedValues);
136              testModel.sorters[0].priority = 2;
137              expectedValues = ["second", "first", "third", "fourth"];
138              verifyModelValues(testModel, expectedValues);
139          }
140  
141          function test_noRolesFirstModel() {
142              noRolesFirstListModel.append([{test: "b"}, {test: "a"}]);
143              var expectedValues = ["a", "b"];
144              verifyModelValues(noRolesFirstProxyModel, expectedValues);
145          }
146  
147          function verifyModelValues(model, expectedValues) {
148              verify(model.count === expectedValues.length,
149                     "Expected count " + expectedValues.length + ", actual count: " + model.count);
150              for (var i = 0; i < model.count; i++)
151              {
152                  var modelValue = model.get(i, "test");
153                  verify(modelValue === expectedValues[i],
154                         "Expected testModel value " + expectedValues[i] + ", actual: " + modelValue);
155              }
156          }
157      }
158  }