File: test_query.cpp

package info (click to toggle)
dnf5 5.4.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 17,960 kB
  • sloc: cpp: 94,312; python: 3,370; xml: 1,073; ruby: 600; sql: 250; ansic: 232; sh: 104; perl: 62; makefile: 30
file content (109 lines) | stat: -rw-r--r-- 3,706 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Copyright Contributors to the DNF5 project.
// Copyright Contributors to the libdnf project.
// SPDX-License-Identifier: GPL-2.0-or-later
//
// This file is part of libdnf: https://github.com/rpm-software-management/libdnf/
//
// Libdnf 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, either version 2 of the License, or
// (at your option) any later version.
//
// Libdnf 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 libdnf.  If not, see <https://www.gnu.org/licenses/>.

#include "test_query.hpp"

#include <libdnf5/common/sack/query.hpp>

CPPUNIT_TEST_SUITE_REGISTRATION(QueryTest);

namespace {

class QueryItem {
public:
    bool enabled;
    int id;
    std::string name;

    bool operator==(const QueryItem & other) const noexcept {
        return enabled == other.enabled && id == other.id && name == other.name;
    }
    bool operator<(const QueryItem & other) const noexcept { return id < other.id; }
};

// Simple query implementation based on libdnf5::sack::Query that works on the QueryItem instances and implements 3 filters.
class TestQuery : public libdnf5::sack::Query<QueryItem> {
public:
    using Query<QueryItem>::Query;

    TestQuery & filter_enabled(bool enabled);
    TestQuery & filter_id(int64_t id, libdnf5::sack::QueryCmp cmp);
    TestQuery & filter_name(const std::string & name, libdnf5::sack::QueryCmp cmp);

private:
    struct F {
        static bool enabled(const QueryItem & obj) { return obj.enabled; }
        static int64_t id(const QueryItem & obj) { return obj.id; }
        static std::string name(const QueryItem & obj) { return obj.name; }
    };
};

TestQuery & TestQuery::filter_enabled(bool enabled) {
    filter(F::enabled, enabled, libdnf5::sack::QueryCmp::EQ);
    return *this;
}

TestQuery & TestQuery::filter_id(int64_t id, libdnf5::sack::QueryCmp cmp) {
    filter(F::id, id, cmp);
    return *this;
}

TestQuery & TestQuery::filter_name(const std::string & name, libdnf5::sack::QueryCmp cmp) {
    filter(F::name, name, cmp);
    return *this;
}

}  // namespace


void QueryTest::setUp() {}


void QueryTest::tearDown() {}


void QueryTest::test_query_basics() {
    TestQuery q(libdnf5::Set<QueryItem>{{true, 4, "item4"}, {false, 6, "item6"}, {true, 10, "item10"}});
    CPPUNIT_ASSERT_EQUAL(q.size(), static_cast<size_t>(3));

    auto q1 = q;
    CPPUNIT_ASSERT_EQUAL(q1.size(), static_cast<size_t>(3));

    // test filter_enabled()
    q1.filter_enabled(true);
    CPPUNIT_ASSERT_EQUAL(q1.size(), static_cast<size_t>(2));
    CPPUNIT_ASSERT((q1 == libdnf5::Set<QueryItem>{{true, 4, "item4"}, {true, 10, "item10"}}));

    // test filter_name()
    q1.filter_name("item10", libdnf5::sack::QueryCmp::EQ);
    CPPUNIT_ASSERT_EQUAL(q1.size(), static_cast<size_t>(1));
    CPPUNIT_ASSERT((q1 == libdnf5::Set<QueryItem>{{true, 10, "item10"}}));

    // test filter_id()
    q1 = q;
    q1.filter_id(6, libdnf5::sack::QueryCmp::GTE);
    CPPUNIT_ASSERT_EQUAL(q1.size(), static_cast<size_t>(2));
    CPPUNIT_ASSERT((q1 == libdnf5::Set<QueryItem>{{false, 6, "item6"}, {true, 10, "item10"}}));

    // test chaining of filter calling
    q1 = q;
    q1.filter_name("item?", libdnf5::sack::QueryCmp::GLOB).filter_enabled(false);
    CPPUNIT_ASSERT_EQUAL(q1.size(), static_cast<size_t>(1));
    CPPUNIT_ASSERT((q1 == libdnf5::Set<QueryItem>{{false, 6, "item6"}}));
}