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 }