blob: 885a28157484310b3968e5bbde4a222ea71ac04c [file] [log] [blame]
// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <gtest/gtest.h>
#include "gestures/include/set.h"
namespace gestures {
class SetTest : public ::testing::Test {};
TEST(SetTest, SimpleTest) {
const int kMax = 5;
set<short, kMax> set_a;
set<short, kMax> set_b;
EXPECT_EQ(0, set_a.size());
EXPECT_EQ(0, set_b.size());
EXPECT_TRUE(set_a.empty());
set<short, kMax>::iterator a_end = set_a.end();
set<short, kMax>::iterator a_f = set_a.find(1);
EXPECT_EQ(a_end, a_f);
EXPECT_EQ(set_a.end(), set_a.find(1));
set_a.insert(1);
EXPECT_EQ(1, set_a.size());
EXPECT_FALSE(set_a.empty());
EXPECT_NE(set_a.end(), set_a.find(1));
set_b.insert(3);
EXPECT_EQ(1, set_b.size());
set_b.insert(3);
EXPECT_EQ(1, set_b.size());
EXPECT_TRUE(set_a != set_b);
set_b.erase(3);
set_b.insert(2);
set_b.insert(1);
EXPECT_EQ(2, set_b.size());
EXPECT_NE(set_b.end(), set_b.find(1));
EXPECT_NE(set_b.end(), set_b.find(2));
EXPECT_TRUE(set_b != set_a);
set_a.insert(2);
EXPECT_EQ(2, set_a.size());
EXPECT_TRUE(set_b == set_a);
set_a.insert(3);
EXPECT_EQ(3, set_a.size());
set_b.insert(3);
EXPECT_EQ(3, set_b.size());
EXPECT_TRUE(set_b == set_a);
EXPECT_EQ(0, set_a.erase(4));
EXPECT_EQ(3, set_a.size());
EXPECT_TRUE(set_b == set_a);
EXPECT_EQ(1, set_a.erase(1));
EXPECT_EQ(2, set_a.size());
EXPECT_EQ(1, set_b.erase(1));
EXPECT_EQ(2, set_b.size());
EXPECT_TRUE(set_b == set_a);
set_a.clear();
EXPECT_EQ(0, set_a.size());
EXPECT_TRUE(set_b != set_a);
set_b.clear();
EXPECT_EQ(0, set_b.size());
EXPECT_TRUE(set_b == set_a);
}
TEST(SetTest, OverflowTest) {
const int kMax = 3;
set<short, kMax> the_set; // holds 3 elts
the_set.insert(4);
the_set.insert(5);
the_set.insert(6);
the_set.insert(7);
EXPECT_EQ(kMax, the_set.size());
EXPECT_NE(the_set.end(), the_set.find(4));
EXPECT_NE(the_set.end(), the_set.find(5));
EXPECT_NE(the_set.end(), the_set.find(6));
EXPECT_EQ(the_set.end(), the_set.find(7));
}
TEST(SetTest, SizeTest) {
set<short, 2> small;
set<short, 3> big;
EXPECT_TRUE(small == big);
EXPECT_FALSE(small != big);
small.insert(3);
big = small;
EXPECT_TRUE(small == big);
big.insert(2);
big.insert(1);
small = big;
}
template<typename ReducedSet, typename RequiredSet>
void DoSetRemoveMissingTest(ReducedSet* reduced,
RequiredSet* required,
bool revserse_insert_order) {
if (!revserse_insert_order) {
reduced->insert(10);
reduced->insert(11);
required->insert(11);
required->insert(12);
} else {
required->insert(12);
required->insert(11);
reduced->insert(11);
reduced->insert(10);
}
SetRemoveMissing(reduced, *required);
EXPECT_EQ(1, reduced->size());
EXPECT_EQ(2, required->size());
EXPECT_TRUE(SetContainsValue(*reduced, 11));
EXPECT_TRUE(SetContainsValue(*required, 11));
EXPECT_TRUE(SetContainsValue(*required, 12));
}
TEST(SetTest, SetRemoveMissingTest) {
for (size_t i = 0; i < 2; i++) {
set<short, 3> small;
set<short, 4> big;
DoSetRemoveMissingTest(&small, &big, i == 0);
}
for (size_t i = 0; i < 2; i++) {
set<short, 3> small;
set<short, 4> big;
DoSetRemoveMissingTest(&big, &small, i == 0);
}
for (size_t i = 0; i < 2; i++) {
set<short, 2> small;
set<short, 3> big;
DoSetRemoveMissingTest(&small, &big, i == 0);
}
for (size_t i = 0; i < 2; i++) {
set<short, 2> small;
set<short, 3> big;
DoSetRemoveMissingTest(&big, &small, i == 0);
}
for (size_t i = 0; i < 2; i++) {
std::set<short> small;
std::set<short> big;
DoSetRemoveMissingTest(&small, &big, i == 0);
}
}
template<typename LeftSet, typename RightSet>
void DoSetSubtractTest() {
LeftSet left;
RightSet right;
left.insert(4);
left.insert(2);
right.insert(1);
right.insert(2);
LeftSet out = SetSubtract(left, right);
EXPECT_EQ(1, out.size());
EXPECT_EQ(4, *out.begin());
EXPECT_EQ(2, left.size());
left.clear();
EXPECT_EQ(0, SetSubtract(left, right).size());
left.insert(5);
EXPECT_EQ(1, SetSubtract(left, right).size());
right.clear();
EXPECT_EQ(1, SetSubtract(left, right).size());
}
TEST(SetTest, SetSubtractTest) {
DoSetSubtractTest<std::set<short>, std::set<short>>();
DoSetSubtractTest<set<short, 3>, set<short, 4>>();
DoSetSubtractTest<set<short, 2>, set<short, 2>>();
DoSetSubtractTest<set<short, 4>, set<short, 2>>();
}
} // namespace gestures