on xenial help sign in
Added tests for model delete
0adb603Nick Dedekind
plugins/Unity/Indicators/unitymenumodelcache.cpp+2−2
@@ -51,7 +51,7 @@ UnityMenuModel* UnityMenuModelCache::model(const QByteArray& bus,
51 return menuModel;
51 return menuModel;
52}
52}
53
53
54−bool UnityMenuModelCache::contains(UnityMenuModel* menuModel)
54+bool UnityMenuModelCache::contains(const QByteArray& path)
55{
55{
56− return !m_registry.keys(menuModel).isEmpty();
56+ return m_registry.contains(path);
57}
57}
plugins/Unity/Indicators/unitymenumodelcache.h+1−1
@@ -37,7 +37,7 @@ public:
37 Q_INVOKABLE UnityMenuModel* model(const QByteArray& bus,
37 Q_INVOKABLE UnityMenuModel* model(const QByteArray& bus,
38 const QByteArray& path,
38 const QByteArray& path,
39 const QVariantMap& actions);
39 const QVariantMap& actions);
40− Q_INVOKABLE bool contains(UnityMenuModel* menuModel);
40+ Q_INVOKABLE bool contains(const QByteArray& path);
41
41
42private:
42private:
43 QHash<QByteArray, UnityMenuModel*> m_registry;
43 QHash<QByteArray, UnityMenuModel*> m_registry;
tests/mocks/QMenuModel/unitymenumodel.cpp+4−4
@@ -37,6 +37,10 @@ UnityMenuModel::UnityMenuModel(QObject *parent)
37{
37{
38}
38}
39
39
40+UnityMenuModel::~UnityMenuModel()
41+{
42+}
43+
40QVariant UnityMenuModel::modelData() const
44QVariant UnityMenuModel::modelData() const
41{
45{
42 return m_modelData;
46 return m_modelData;
@@ -82,10 +86,6 @@ void UnityMenuModel::removeRow(int row)
82 endRemoveRows();
86 endRemoveRows();
83}
87}
84
88
85−UnityMenuModel::~UnityMenuModel()
86−{
87−}
88−
89QByteArray UnityMenuModel::busName() const
89QByteArray UnityMenuModel::busName() const
90{
90{
91 return m_busName;
91 return m_busName;
tests/qmltests/Panel/Indicators/tst_CachedUnityMenuModel.qml+66−25
@@ -18,6 +18,7 @@ import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import Unity.Test 0.1 as UT
19import Unity.Test 0.1 as UT
20import QMenuModel 0.1
20import QMenuModel 0.1
21+import Unity.Indicators 0.1 as Indicators
21import "../../../../qml/Panel/Indicators"
22import "../../../../qml/Panel/Indicators"
22
23
23Item {
24Item {
@@ -34,37 +35,48 @@ Item {
34 name: "CachedUnityMenuModel"
35 name: "CachedUnityMenuModel"
35 when: windowShown
36 when: windowShown
36
37
38+ function cleanup() {
39+ doGC();
40+ }
41+
42+ function doGC() {
43+ // need to put some wait cycles here to get gc going properly.
44+ wait(10);
45+ gc();
46+ wait(10);
47+ }
48+
37 function test_createDifferent() {
49 function test_createDifferent() {
38− var cachedObject = model.createObject(root,
50+ var cachedObject = model.createObject(null,
39 {
51 {
40 "busName": "com.canonical.test1",
52 "busName": "com.canonical.test1",
41− "menuObjectPath": "com/canonical/test1",
53+ "menuObjectPath": "/com/canonical/test1",
42− "actionsObjectPath": "com/canonical/test1/actions"
54+ "actionsObjectPath": "/com/canonical/test1"
43 });
55 });
44
56
45− var cachedObject2 = model.createObject(root,
57+ var cachedObject2 = model.createObject(null,
46 {
58 {
47 "busName": "com.canonical.test2",
59 "busName": "com.canonical.test2",
48− "menuObjectPath": "com/canonical/test2",
60+ "menuObjectPath": "/com/canonical/test2",
49− "actionsObjectPath": "com/canonical/test2/actions"
61+ "actionsObjectPath": "/com/canonical/test2"
50 });
62 });
51
63
52 verify(cachedObject.model !== cachedObject2.model);
64 verify(cachedObject.model !== cachedObject2.model);
53 }
65 }
54
66
55 function test_createSame() {
67 function test_createSame() {
56− var cachedObject = model.createObject(root,
68+ var cachedObject = model.createObject(null,
57 {
69 {
58− "busName": "com.canonical.test1",
70+ "busName": "com.canonical.test3",
59− "menuObjectPath": "com/canonical/test1",
71+ "menuObjectPath": "/com/canonical/test3",
60− "actionsObjectPath": "com/canonical/test1/actions"
72+ "actionsObjectPath": "/com/canonical/test3"
61 });
73 });
62
74
63− var cachedObject2 = model.createObject(root,
75+ var cachedObject2 = model.createObject(null,
64 {
76 {
65− "busName": "com.canonical.test1",
77+ "busName": "com.canonical.test3",
66− "menuObjectPath": "com/canonical/test1",
78+ "menuObjectPath": "/com/canonical/test3",
67− "actionsObjectPath": "com/canonical/test1/actions"
79+ "actionsObjectPath": "/com/canonical/test3"
68 });
80 });
69
81
70 verify(cachedObject.model === cachedObject2.model);
82 verify(cachedObject.model === cachedObject2.model);
@@ -72,25 +84,54 @@ Item {
72
84
73 // Tests that changing cached model data does not change the model path of others
85 // Tests that changing cached model data does not change the model path of others
74 function test_lp1328646() {
86 function test_lp1328646() {
75− var cachedObject = model.createObject(root,
87+ var cachedObject = model.createObject(null,
76 {
88 {
77− "busName": "com.canonical.test1",
89+ "busName": "com.canonical.test4",
78− "menuObjectPath": "com/canonical/test1",
90+ "menuObjectPath": "/com/canonical/test4",
79− "actionsObjectPath": "com/canonical/test1/actions"
91+ "actionsObjectPath": "/com/canonical/test4"
80 });
92 });
81
93
82− var cachedObject2 = model.createObject(root,
94+ var cachedObject2 = model.createObject(null,
83 {
95 {
84− "busName": "com.canonical.test1",
96+ "busName": "com.canonical.test4",
85− "menuObjectPath": "com/canonical/test1",
97+ "menuObjectPath": "/com/canonical/test4",
86− "actionsObjectPath": "com/canonical/test1/actions"
98+ "actionsObjectPath": "/com/canonical/test4"
87 });
99 });
88
100
89− cachedObject.menuObjectPath = "com/canonical/test2";
101+ cachedObject.menuObjectPath = "/com/canonical/test5";
90− compare(cachedObject.model.menuObjectPath, "com/canonical/test2");
102+ compare(cachedObject.model.menuObjectPath, "/com/canonical/test5");
91− compare(cachedObject2.model.menuObjectPath, "com/canonical/test1");
103+ compare(cachedObject2.model.menuObjectPath, "/com/canonical/test4");
92
104
93 verify(cachedObject.model !== cachedObject2.model);
105 verify(cachedObject.model !== cachedObject2.model);
94 }
106 }
107+
108+ function createAndDestroy(test) {
109+ var cachedObject = model.createObject(null,
110+ {
111+ "busName": "com.canonical."+test,
112+ "menuObjectPath": "/com/canonical/"+test,
113+ "actionsObjectPath": "/com/canonical/"+test
114+ });
115+ var cachedObject2 = model.createObject(null,
116+ {
117+ "busName": "com.canonical."+test,
118+ "menuObjectPath": "/com/canonical/"+test,
119+ "actionsObjectPath": "/com/canonical/"+test
120+ });
121+ cachedObject.destroy();
122+ return cachedObject2;
123+ }
124+
125+ function test_destroyAllDeletesModel() {
126+ createAndDestroy("test6");
127+ doGC();
128+ compare(Indicators.UnityMenuModelCache.contains("/com/canonical/test6"), false);
129+ }
130+
131+ function test_destroyPartialKeepsModel() {
132+ var model = createAndDestroy("test7");
133+ doGC();
134+ compare(Indicators.UnityMenuModelCache.contains("/com/canonical/test7"), true);
135+ }
95 }
136 }
96}
137}