summaryrefslogtreecommitdiffstats
blob: 6ac51b21125234320395217ee409f658db91db8a (plain)
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
 * Copyright (c) 2014-2016 Isode Limited.
 * All rights reserved.
 * See the COPYING file for more information.
 */

#include <memory>

#include <boost/bind.hpp>
#include <boost/function.hpp>

#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>

#include <Swift/Controllers/ContactSuggester.h>

using namespace Swift;

class ContactSuggesterTest : public CppUnit::TestFixture {
    CPPUNIT_TEST_SUITE(ContactSuggesterTest);
    CPPUNIT_TEST(equalityTest);
    CPPUNIT_TEST(lexicographicalSortTest);
    CPPUNIT_TEST(sortTest);
    CPPUNIT_TEST_SUITE_END();

public:

    std::vector<std::string> wordList() {
        const std::string words[] = {
            "abc",
            "ab",
            "bc",
            "d"
        };

        return std::vector<std::string>(words, words+sizeof(words)/sizeof(*words));
    }

    std::vector<StatusShow::Type> statusList() {
        StatusShow::Type types[] = {
            StatusShow::Online,
            StatusShow::Away,
            StatusShow::FFC,
            StatusShow::XA,
            StatusShow::DND,
            StatusShow::None
        };

        return std::vector<StatusShow::Type>(types, types+sizeof(types)/sizeof(*types));
    }

    std::vector<Contact::ref> contactList() {
        std::vector<Contact::ref> contacts;
        std::vector<std::string> words = wordList();
        std::vector<StatusShow::Type> statuses = statusList();
        for (const auto& name : words) {
            for (const auto& jid : words) {
                for (const auto& status : statuses) {
                    contacts.push_back(std::make_shared<Contact>(name, jid, status, ""));
                }
            }
        }
        return contacts;
    }

    /* a = a */
    bool isReflexive(const boost::function<bool (const Contact::ref&, const Contact::ref&)>& comparitor) {
        std::vector<Contact::ref> contacts = contactList();
        for (const auto& a : contacts) {
            if (!comparitor(a, a)) {
                return false;
            }
        }
        return true;
    }

    /* a = b -> b = a */
    bool isSymmetric(const boost::function<bool (const Contact::ref&, const Contact::ref&)>& comparitor) {
        std::vector<Contact::ref> contacts = contactList();
        for (const auto& a : contacts) {
            for (const auto& b : contacts) {
                if (comparitor(a, b)) {
                    if (!comparitor(b, a)) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    /* a = b && b = c -> a = c */
    bool isTransitive(const boost::function<bool (const Contact::ref&, const Contact::ref&)>& comparitor) {
        std::vector<Contact::ref> contacts = contactList();
        for (const auto& a : contacts) {
            for (const auto& b : contacts) {
                for (const auto& c : contacts) {
                    if (comparitor(a, b) && comparitor(b, c)) {
                        if (!comparitor(a, c)) {
                            return false;
                        }
                    }
                }
            }
        }
        return true;
    }

    void equalityTest() {
        CPPUNIT_ASSERT(isReflexive(Contact::equalityPredicate));
        CPPUNIT_ASSERT(isSymmetric(Contact::equalityPredicate));
        CPPUNIT_ASSERT(isTransitive(Contact::equalityPredicate));
    }

    void lexicographicalSortTest() {
        CPPUNIT_ASSERT(isTransitive(Contact::lexicographicalSortPredicate));
    }

    void sortTest() {
        std::vector<std::string> words = wordList();
        for (const auto& word : words) {
            CPPUNIT_ASSERT(isTransitive(boost::bind(Contact::sortPredicate, _1, _2, word)));
        }
    }

};

CPPUNIT_TEST_SUITE_REGISTRATION(ContactSuggesterTest);