1/* -*- c++ -*- */
2/*
3 * Copyright (C) 2010 The Android Open Source Project
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *  * Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 *  * Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in
13 *    the documentation and/or other materials provided with the
14 *    distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
22 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
23 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
26 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#include "../include/set"
31#ifndef ANDROID_ASTL_SET__
32#error "Wrong header included!!"
33#endif
34#include <climits>
35#include <cstring>
36#include <string>
37#include "common.h"
38
39namespace android {
40using std::pair;
41using std::set;
42using std::string;
43
44bool testConstructor()
45{
46    set<int> s;
47    EXPECT_TRUE(s.empty());
48    EXPECT_TRUE(s.size() == 0);
49    EXPECT_TRUE(s.begin() == s.end());
50    EXPECT_TRUE(s.count(10) == 0);
51    return true;
52}
53
54bool testInsertPOD()
55{
56    set<int> s;
57    pair<set<int>::iterator, bool> res;
58
59    EXPECT_TRUE(s.count(10) == 0);
60
61    res = s.insert(10);
62
63    // begin should point to the element inserted.
64    EXPECT_TRUE(res.first == s.begin());
65    EXPECT_TRUE(s.end() != s.begin());
66    EXPECT_TRUE(*(res.first) == 10);
67    set<int>::iterator elt_in_set = res.first;
68    EXPECT_TRUE(*(s.begin()) == 10);
69
70    // insert was a success.
71    EXPECT_TRUE(res.second);
72
73    // element can be found
74    EXPECT_TRUE(s.count(10) == 1);
75
76    // Try to insert the same element again, this time it should fail.
77    res = s.insert(10);
78    // insert was a failure.
79    EXPECT_TRUE(!res.second);
80
81    // Insert should return an iterator pointing to the element
82    // already in the set.
83    EXPECT_TRUE(res.first == elt_in_set);
84
85    // element can still be found
86    EXPECT_TRUE(s.count(10) == 1);
87    return true;
88}
89
90bool testInsertString()
91{
92    set<string> s;
93    pair<set<string>::iterator, bool> res;
94    string str("a string");
95    string str_equiv("a string");
96    string str_missing("a string not in the set");
97
98    EXPECT_TRUE(s.count(str) == 0);
99
100    res = s.insert(str);
101
102    // begin should point to the element inserted.
103    EXPECT_TRUE(res.first == s.begin());
104    set<string>::iterator marker = res.first;
105    EXPECT_TRUE(s.end() != s.begin());
106    EXPECT_TRUE(*(res.first) == str);
107    EXPECT_TRUE(*(s.begin()) == str);
108
109    // insert was a success.
110    EXPECT_TRUE(res.second);
111
112    // element can be found
113    EXPECT_TRUE(s.count(str) == 1);
114
115    // Try to insert an element equivalent.
116    res = s.insert(str_equiv);
117
118    // insert did not happen since there is one string equivalent
119    // already.
120    EXPECT_TRUE(!res.second);
121
122    // The iterator points to the copy already in the set.
123    EXPECT_TRUE(res.first == marker);
124
125    // element can still be found
126    EXPECT_TRUE(s.count(str) == 1);
127    EXPECT_TRUE(s.count(str_equiv) == 1);
128    return true;
129}
130
131}  // namespace android
132
133int main(int argc, char **argv)
134{
135    FAIL_UNLESS(testConstructor);
136    FAIL_UNLESS(testInsertPOD);
137    FAIL_UNLESS(testInsertString);
138    return kPassed;
139}
140