/*
* Copyright (C) 2011, 2013 Canonical, Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "filtersbindingstest.h"
// libunity-core
#include
#include
// Qt
#include
#include
// libunity
#include
// local
#include "filter.h"
#include "multirangefilter.h"
#include "combinedfilteroption.h"
#include "checkoptionfilter.h"
#include "radiooptionfilter.h"
void FiltersBindingsTest::initTestCase()
{
}
GVariant* FiltersBindingsTest::createOptions(int numOfOptions)
{
auto vtype = g_variant_type_new("a(sssb)");
auto vb = g_variant_builder_new(vtype);
for (int i = 0; i(bind_filter);
QVERIFY(multi_filter != nullptr);
auto options = multi_filter->options();
QCOMPARE(options->rowCount(), 1);
QVariant optvar = options->data(options->index(0));
CombinedFilterOption* opt1 = optvar.value();
QCOMPARE(opt1->id(), QString("opt0"));
delete multi_filter;
}
// create filter out of 2nd row
iter = dee_model_next(DEE_MODEL(model), iter);
{
auto core_filter = unity::dash::Filter::FilterFromIter(model, iter);
QVERIFY(core_filter != nullptr);
auto bind_filter = Filter::newFromUnityFilter(core_filter);
auto multi_filter = dynamic_cast(bind_filter);
QVERIFY(multi_filter != nullptr);
auto options = multi_filter->options();
QCOMPARE(options->rowCount(), 2);
QVariant optvar = options->data(options->index(0));
CombinedFilterOption* opt1 = optvar.value();
QCOMPARE(opt1->id(), QString("opt0-opt1"));
optvar = options->data(options->index(1));
CombinedFilterOption* opt2 = optvar.value();
QCOMPARE(opt2->id(), QString("opt1"));
delete multi_filter;
}
// create filter out of 3nd row
iter = dee_model_next(DEE_MODEL(model), iter);
{
auto core_filter = unity::dash::Filter::FilterFromIter(model, iter);
QVERIFY(core_filter != nullptr);
auto bind_filter = Filter::newFromUnityFilter(core_filter);
auto multi_filter = dynamic_cast(bind_filter);
QVERIFY(multi_filter != nullptr);
auto options = multi_filter->options();
QCOMPARE(options->rowCount(), 3);
QVariant optvar = options->data(options->index(0));
CombinedFilterOption* opt0 = optvar.value();
QCOMPARE(opt0->id(), QString("opt0-opt1"));
optvar = options->data(options->index(1));
CombinedFilterOption* opt1 = optvar.value();
QCOMPARE(opt1->id(), QString("opt1-opt2"));
optvar = options->data(options->index(2));
CombinedFilterOption* opt2 = optvar.value();
QCOMPARE(opt2->id(), QString("opt2"));
// verify combined filter options are bound to correct underlying unity options
auto core_multi_filter = std::dynamic_pointer_cast(core_filter);
QCOMPARE(QString::fromStdString(core_multi_filter->options()[0]->id()), QString("opt0"));
QCOMPARE(QString::fromStdString(core_multi_filter->options()[1]->id()), QString("opt1"));
QCOMPARE(QString::fromStdString(core_multi_filter->options()[2]->id()), QString("opt2"));
QSignalSpy opt0spy(opt0, SIGNAL(activeChanged(bool)));
QSignalSpy opt1spy(opt1, SIGNAL(activeChanged(bool)));
QSignalSpy opt2spy(opt2, SIGNAL(activeChanged(bool)));
// test active property changes
QCOMPARE(opt0->active(), false);
opt0->setActive(true); // activate 1st combined option
QCOMPARE(opt0spy.count(), 1);
QCOMPARE(opt1spy.count(), 0);
QCOMPARE(opt2spy.count(), 0);
QCOMPARE(opt0->active(), true);
QCOMPARE(opt1->active(), false);
QCOMPARE(core_multi_filter->options()[0]->active(), true);
QCOMPARE(core_multi_filter->options()[1]->active(), true);
QCOMPARE(core_multi_filter->options()[2]->active(), false);
opt1->setActive(true); // activate another combined option
QCOMPARE(opt0spy.count(), 2);
QCOMPARE(opt1spy.count(), 1);
QCOMPARE(opt2spy.count(), 0);
QCOMPARE(opt0->active(), false); //1st combined option gets deactivated
QCOMPARE(opt1->active(), true);
QCOMPARE(core_multi_filter->options()[0]->active(), false);
QCOMPARE(core_multi_filter->options()[1]->active(), true); // shared option, stays active
QCOMPARE(core_multi_filter->options()[2]->active(), true);
opt1->setActive(false); // and de-activate it
QCOMPARE(opt0spy.count(), 2);
QCOMPARE(opt1spy.count(), 2);
QCOMPARE(opt2spy.count(), 0);
QCOMPARE(opt0->active(), false);
QCOMPARE(opt1->active(), false);
QCOMPARE(core_multi_filter->options()[0]->active(), false);
QCOMPARE(core_multi_filter->options()[1]->active(), false);
QCOMPARE(core_multi_filter->options()[2]->active(), false);
opt2->setActive(true); // activate another combined option
QCOMPARE(opt0spy.count(), 2);
QCOMPARE(opt1spy.count(), 2);
QCOMPARE(opt2spy.count(), 1);
QCOMPARE(opt0->active(), false);
QCOMPARE(opt1->active(), false);
QCOMPARE(opt2->active(), true);
QCOMPARE(core_multi_filter->options()[0]->active(), false);
QCOMPARE(core_multi_filter->options()[1]->active(), false);
QCOMPARE(core_multi_filter->options()[2]->active(), true);
delete multi_filter;
}
}
void FiltersBindingsTest::testCheckOptionFilter()
{
auto model = createFilterModel();
createCheckOptionFilter(model, "f1", "Filter1", 3);
// create filter out of 1st row
auto iter = dee_model_get_first_iter(DEE_MODEL(model));
{
auto core_filter = unity::dash::Filter::FilterFromIter(model, iter);
QVERIFY(core_filter != nullptr);
auto bind_filter = Filter::newFromUnityFilter(core_filter);
auto check_filter = dynamic_cast(bind_filter);
QVERIFY(check_filter != nullptr);
auto options = check_filter->options();
QCOMPARE(options->rowCount(), 3);
QCOMPARE(check_filter->id(), QString("f1"));
QCOMPARE(check_filter->name(), QString("Filter1"));
QCOMPARE(check_filter->iconHint(), QString(""));
QCOMPARE(check_filter->rendererName(), QString("filter-checkoption"));
QCOMPARE(check_filter->visible(), true);
QCOMPARE(check_filter->collapsed(), false);
QCOMPARE(check_filter->filtering(), false);
QVariant optvar = options->data(options->index(0));
FilterOption* opt0 = optvar.value();
QCOMPARE(opt0->id(), QString("opt0"));
optvar = options->data(options->index(1));
FilterOption* opt1 = optvar.value();
QCOMPARE(opt1->id(), QString("opt1"));
optvar = options->data(options->index(2));
FilterOption* opt2 = optvar.value();
QCOMPARE(opt2->id(), QString("opt2"));
QSignalSpy opt0spy(opt0, SIGNAL(activeChanged(bool)));
QSignalSpy opt1spy(opt1, SIGNAL(activeChanged(bool)));
QSignalSpy opt2spy(opt2, SIGNAL(activeChanged(bool)));
// test active property changes
QCOMPARE(opt0->active(), false);
QCOMPARE(opt1->active(), false);
QCOMPARE(opt2->active(), false);
opt0->setActive(true);
QCOMPARE(opt0spy.count(), 1);
QCOMPARE(opt1spy.count(), 0);
QCOMPARE(opt2spy.count(), 0);
QCOMPARE(opt0->active(), true);
QCOMPARE(opt1->active(), false);
QCOMPARE(opt2->active(), false);
opt1->setActive(true);
QCOMPARE(opt0spy.count(), 2);
QCOMPARE(opt1spy.count(), 1);
QCOMPARE(opt2spy.count(), 0);
QCOMPARE(opt0->active(), false);
QCOMPARE(opt1->active(), true);
QCOMPARE(opt2->active(), false);
delete check_filter;
}
}
void FiltersBindingsTest::testRadioOptionFilter()
{
auto model = createFilterModel();
createRadioOptionFilter(model, "f1", "Filter1", 3);
// create filter out of 1st row
auto iter = dee_model_get_first_iter(DEE_MODEL(model));
{
auto core_filter = unity::dash::Filter::FilterFromIter(model, iter);
QVERIFY(core_filter != nullptr);
auto bind_filter = Filter::newFromUnityFilter(core_filter);
auto radio_filter = dynamic_cast(bind_filter);
QVERIFY(radio_filter != nullptr);
auto options = radio_filter->options();
QCOMPARE(options->rowCount(), 3);
QVariant optvar = options->data(options->index(0));
FilterOption* opt0 = optvar.value();
QCOMPARE(opt0->id(), QString("opt0"));
optvar = options->data(options->index(1));
FilterOption* opt1 = optvar.value();
QCOMPARE(opt1->id(), QString("opt1"));
optvar = options->data(options->index(2));
FilterOption* opt2 = optvar.value();
QCOMPARE(opt2->id(), QString("opt2"));
QSignalSpy opt0spy(opt0, SIGNAL(activeChanged(bool)));
QSignalSpy opt1spy(opt1, SIGNAL(activeChanged(bool)));
QSignalSpy opt2spy(opt2, SIGNAL(activeChanged(bool)));
// test active property changes
QCOMPARE(opt0->active(), false);
QCOMPARE(opt1->active(), false);
QCOMPARE(opt2->active(), false);
opt0->setActive(true);
QCOMPARE(opt0spy.count(), 1);
QCOMPARE(opt1spy.count(), 0);
QCOMPARE(opt2spy.count(), 0);
QCOMPARE(opt0->active(), true);
QCOMPARE(opt1->active(), false);
QCOMPARE(opt2->active(), false);
opt1->setActive(true);
QCOMPARE(opt0spy.count(), 2);
QCOMPARE(opt1spy.count(), 1);
QCOMPARE(opt2spy.count(), 0);
QCOMPARE(opt0->active(), false);
QCOMPARE(opt1->active(), true);
QCOMPARE(opt2->active(), false);
delete radio_filter;
}
}
QTEST_MAIN(FiltersBindingsTest)