@@ -33,6 +33,8 @@
33#include "combinedfilteroption.h"
33#include "combinedfilteroption.h"
34#include "checkoptionfilter.h"
34#include "checkoptionfilter.h"
35#include "radiooptionfilter.h"
35#include "radiooptionfilter.h"
36+#include "ratingsfilter.h"
37+#include "ratingfilteroption.h"
37void FiltersBindingsTest::initTestCase()
39void FiltersBindingsTest::initTestCase()
@@ -73,6 +75,30 @@ void FiltersBindingsTest::createCheckOptionFilter(DeeModel *model, const std::st
73 createFilter(model, "filter-checkoption", id, name, optionCount);
75 createFilter(model, "filter-checkoption", id, name, optionCount);
78+void FiltersBindingsTest::createRatingsFilter(DeeModel *model, const std::string &id, const std::string &name)
82+ row[0] = g_variant_new_string(id.c_str());
83+ row[1] = g_variant_new_string(name.c_str());
84+ row[2] = g_variant_new_string(""); // icon hint
85+ row[3] = g_variant_new_string("filter-ratings");
87+ GVariant *children[2];
88+ GVariant *key1 = g_variant_new_string("show-all-button");
89+ GVariant *key2 = g_variant_new_string("rating");
90+ children[0] = g_variant_new_dict_entry(key1, g_variant_new_variant(g_variant_new_boolean(false)));
91+ children[1] = g_variant_new_dict_entry(key2, g_variant_new_variant(g_variant_new_double(0.0f)));
92+ auto fhints = g_variant_new_array(G_VARIANT_TYPE("{sv}"), children, 2);
95+ row[5] = g_variant_new_boolean(true); // visible
96+ row[6] = g_variant_new_boolean(false); // collapsed
97+ row[7] = g_variant_new_boolean(false); // filtering
99+ dee_model_append_row(model, row);
76void FiltersBindingsTest::createFilter(DeeModel *model, const std::string &renderer, const std::string &id, const std::string &name, int optionCount)
102void FiltersBindingsTest::createFilter(DeeModel *model, const std::string &renderer, const std::string &id, const std::string &name, int optionCount)
78 GVariant* row[8];
104 GVariant* row[8];
@@ -350,4 +376,61 @@ void FiltersBindingsTest::testRadioOptionFilter()
379+void FiltersBindingsTest::testRatingsFilter()
381+ auto model = createFilterModel();
383+ createRatingsFilter(model, "f1", "Filter1");
385+ // create filter out of 1st row
386+ auto iter = dee_model_get_first_iter(DEE_MODEL(model));
388+ auto core_filter = unity::dash::Filter::FilterFromIter(model, iter);
389+ QVERIFY(core_filter != nullptr);
390+ auto bind_filter = Filter::newFromUnityFilter(core_filter);
391+ auto rating_filter = dynamic_cast<RatingsFilter*>(bind_filter);
392+ QVERIFY(rating_filter != nullptr);
393+ auto options = rating_filter->options();
394+ QCOMPARE(options->rowCount(), 5);
396+ RatingFilterOption* opt[5];
397+ for (int i = 0; i<5; i++) {
398+ opt[i] = options->data(options->index(i)).value<RatingFilterOption*>();
401+ QSignalSpy opt0spy(opt[0], SIGNAL(activeChanged(bool)));
402+ QSignalSpy opt4spy(opt[4], SIGNAL(activeChanged(bool)));
404+ QVERIFY(qAbs(opt[0]->value() - 0.2f) <= 0.0001f);
405+ QVERIFY(qAbs(opt[1]->value() - 0.4f) <= 0.0001f);
406+ QVERIFY(qAbs(opt[2]->value() - 0.6f) <= 0.0001f);
407+ QVERIFY(qAbs(opt[3]->value() - 0.8f) <= 0.0001f);
408+ QVERIFY(qAbs(opt[4]->value() - 1.0f) <= 0.0001f);
410+ // all options initially inactive
411+ for (int i=0; i<5; i++) {
412+ QCOMPARE(opt[i]->active(), false);
415+ // verify activation for all options
416+ for (int i=0; i<5; i++) {
417+ opt[i]->setActive(true);
418+ QCOMPARE(opt[i]->active(), true);
420+ // verify that all other options are inactive
421+ for (int j=0; j<5; j++) {
423+ QCOMPARE(opt[j]->active(), false);
428+ QCOMPARE(opt0spy.count(), 2);
429+ QCOMPARE(opt4spy.count(), 1);
431+ opt[4]->setActive(false);
432+ QCOMPARE(opt4spy.count(), 2);
353QTEST_MAIN(FiltersBindingsTest)
436QTEST_MAIN(FiltersBindingsTest)