1 /** 2 * Copyright 2020 Huawei Technologies Co., Ltd 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #include <iostream> 17 #include <sstream> 18 #include <memory> 19 #include <algorithm> 20 21 #include "utils/ordered_set.h" 22 #include "utils/ordered_map.h" 23 #include "common/common_test.h" 24 25 using std::cout; 26 using std::endl; 27 using std::string; 28 29 namespace mindspore { 30 31 class TestOrderedSet : public UT::Common { 32 public: 33 TestOrderedSet() { 34 std::shared_ptr<int> e; 35 for (int i = 1; i <= 10; i++) { 36 e = std::make_shared<int>(i); 37 osa.add(e); 38 } 39 for (int i = 11; i <= 20; i++) { 40 e = std::make_shared<int>(i); 41 osa.add(e); 42 osb.add(e); 43 } 44 for (int i = 21; i <= 30; i++) { 45 e = std::make_shared<int>(i); 46 osb.add(e); 47 osc.add(e); 48 } 49 } 50 51 public: 52 OrderedSet<std::shared_ptr<int>> osa; 53 OrderedSet<std::shared_ptr<int>> osb; 54 OrderedSet<std::shared_ptr<int>> osc; 55 }; 56 57 TEST_F(TestOrderedSet, test_constructor) { 58 OrderedSet<std::shared_ptr<int>> osa_copy = osa; 59 ASSERT_EQ(osa_copy.size(), osa.size()); 60 61 std::shared_ptr<int> e = std::make_shared<int>(1); 62 OrderedSet<std::shared_ptr<int>> se; 63 se.add(std::make_shared<int>(10)); 64 se.add(std::make_shared<int>(20)); 65 OrderedSet<std::shared_ptr<int>> order_se(se); 66 ASSERT_EQ(order_se.size(), 2); 67 } 68 69 TEST_F(TestOrderedSet, test_add_remove_clear) { 70 OrderedSet<std::shared_ptr<int>> res; 71 res.add(std::make_shared<int>(1)); 72 std::shared_ptr<int> e = std::make_shared<int>(2); 73 std::shared_ptr<int> e2 = std::make_shared<int>(10); 74 res.add(e); 75 ASSERT_EQ(res.size(), 2); 76 ASSERT_EQ(res.count(e), 1); 77 auto elem = res.back(); 78 ASSERT_EQ(elem, e); 79 res.erase(e); 80 ASSERT_EQ(res.size(), 1); 81 res.clear(); 82 ASSERT_EQ(res.size(), 0); 83 } 84 85 TEST_F(TestOrderedSet, test_add_remove_first) { 86 OrderedSet<int> a; 87 a.add(1); 88 a.add(2); 89 a.add(3); 90 a.erase(1); 91 auto first = a.pop(); 92 // 1 removed, 2 3 followed, 2 should be the popped one, remaining size = 1 93 ASSERT_EQ(first, 2); 94 ASSERT_EQ(a.size(), 1); 95 } 96 97 TEST_F(TestOrderedSet, test_compare) { 98 OrderedSet<std::shared_ptr<int>> c1; 99 OrderedSet<std::shared_ptr<int>> c2; 100 std::shared_ptr<int> e1 = std::make_shared<int>(10); 101 std::shared_ptr<int> e2 = std::make_shared<int>(20); 102 c1.add(e1); 103 c1.add(e2); 104 c2.add(e1); 105 c2.add(e2); 106 ASSERT_EQ(c1, c2); 107 } 108 109 TEST_F(TestOrderedSet, test_pop) { 110 OrderedSet<std::shared_ptr<int>> oset; 111 oset.add(std::make_shared<int>(10)); 112 oset.add(std::make_shared<int>(20)); 113 oset.add(std::make_shared<int>(30)); 114 std::shared_ptr<int> ele = oset.pop(); 115 int pop_size = 0; 116 pop_size++; 117 while (oset.size() != 0) { 118 ele = oset.pop(); 119 pop_size++; 120 } 121 ASSERT_EQ(pop_size, 3); 122 ASSERT_EQ(oset.size(), 0); 123 } 124 125 TEST_F(TestOrderedSet, test_operation) { 126 ASSERT_TRUE(osc.is_disjoint(osa)); 127 ASSERT_TRUE(!osb.is_disjoint(osa)); 128 129 ASSERT_TRUE(osc.is_subset(osb)); 130 ASSERT_TRUE(!osc.is_subset(osa)); 131 132 OrderedSet<std::shared_ptr<int>> res_inter = osa | osb; 133 ASSERT_EQ(res_inter.size(), 30); 134 OrderedSet<std::shared_ptr<int>> res_union = osa & osb; 135 ASSERT_EQ(res_union.size(), 10); 136 OrderedSet<std::shared_ptr<int>> res_diff = osa - osb; 137 ASSERT_EQ(res_diff.size(), 10); 138 OrderedSet<std::shared_ptr<int>> res_symdiff = osa ^ osb; 139 ASSERT_EQ(res_symdiff.size(), 20); 140 } 141 142 TEST_F(TestOrderedSet, test_contains) { 143 OrderedSet<std::shared_ptr<int>> res; 144 std::shared_ptr<int> e1 = std::make_shared<int>(10); 145 std::shared_ptr<int> e2 = std::make_shared<int>(20); 146 res.add(e1); 147 ASSERT_TRUE(res.contains(e1)); 148 ASSERT_TRUE(!res.contains(e2)); 149 } 150 151 TEST_F(TestOrderedSet, test_assign) { 152 OrderedSet<int> s; 153 s.add(10); 154 ASSERT_EQ(s.size(), 1); 155 OrderedSet<int> s1; 156 s1.add(20); 157 s1.add(30); 158 ASSERT_EQ(s1.size(), 2); 159 s = s1; 160 ASSERT_EQ(s.size(), 2); 161 ASSERT_EQ(s, s1); 162 } 163 164 TEST_F(TestOrderedSet, test_map_assign) { 165 OrderedMap<int, int> m; 166 m[10] = 10; 167 ASSERT_EQ(m.size(), 1); 168 OrderedMap<int, int> m1; 169 m1[20] = 20; 170 m1[30] = 30; 171 ASSERT_EQ(m1.size(), 2); 172 m = m1; 173 ASSERT_EQ(m.size(), 2); 174 ASSERT_EQ(m[20], m1[20]); 175 ASSERT_EQ(m[30], m1[30]); 176 } 177 178 } // namespace mindspore 179