| /* |
| * Copyright 2024 WebAssembly Community Group participants |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "support/disjoint_sets.h" |
| #include "gtest/gtest.h" |
| |
| using namespace wasm; |
| |
| TEST(DisjointSetsTest, NewSets) { |
| DisjointSets sets; |
| auto elem1 = sets.addSet(); |
| auto elem2 = sets.addSet(); |
| EXPECT_NE(elem1, elem2); |
| |
| auto root1 = sets.getRoot(elem1); |
| EXPECT_EQ(elem1, root1); |
| |
| auto root2 = sets.getRoot(elem2); |
| EXPECT_EQ(elem2, root2); |
| } |
| |
| TEST(DisjointSetsTest, Union) { |
| DisjointSets sets; |
| auto elem1 = sets.addSet(); |
| auto elem2 = sets.addSet(); |
| auto root = sets.getUnion(elem1, elem2); |
| EXPECT_TRUE(root == elem1 || root == elem2); |
| |
| auto root1 = sets.getRoot(elem1); |
| auto root2 = sets.getRoot(elem2); |
| EXPECT_EQ(root1, root); |
| EXPECT_EQ(root2, root); |
| } |
| |
| TEST(DisjointSetsTest, TwoUnions) { |
| DisjointSets sets; |
| auto elem1 = sets.addSet(); |
| auto elem2 = sets.addSet(); |
| auto elem3 = sets.addSet(); |
| auto elem4 = sets.addSet(); |
| |
| auto rootA = sets.getUnion(elem1, elem3); |
| auto rootB = sets.getUnion(elem2, elem4); |
| EXPECT_EQ(sets.getRoot(elem1), rootA); |
| EXPECT_EQ(sets.getRoot(elem2), rootB); |
| EXPECT_EQ(sets.getRoot(elem3), rootA); |
| EXPECT_EQ(sets.getRoot(elem4), rootB); |
| EXPECT_NE(rootA, rootB); |
| } |
| |
| TEST(DisjointSetsTest, UnionList) { |
| constexpr size_t count = 16; |
| DisjointSets sets; |
| size_t elems[count]; |
| for (size_t i = 0; i < count; ++i) { |
| elems[i] = sets.addSet(); |
| } |
| |
| for (size_t i = 1; i < count; ++i) { |
| sets.getUnion(elems[i], elems[i - 1]); |
| } |
| |
| auto root = sets.getRoot(elems[0]); |
| for (size_t rep = 0; rep < 2; ++rep) { |
| for (size_t i = 0; i < count; ++i) { |
| auto currRoot = sets.getRoot(elems[i]); |
| EXPECT_EQ(currRoot, root); |
| } |
| } |
| } |
| |
| TEST(DisjointSetsTest, UnionTree) { |
| constexpr size_t count = 16; |
| DisjointSets sets; |
| size_t elems[count]; |
| for (size_t i = 0; i < count; ++i) { |
| elems[i] = sets.addSet(); |
| } |
| |
| for (size_t stride = 2; stride <= count; stride *= 2) { |
| for (size_t i = 0; i < count; i += stride) { |
| sets.getUnion(elems[i], elems[i + stride / 2]); |
| } |
| } |
| |
| auto root = sets.getRoot(elems[0]); |
| for (size_t rep = 0; rep < 2; ++rep) { |
| for (size_t i = 0; i < count; ++i) { |
| auto currRoot = sets.getRoot(elems[i]); |
| EXPECT_EQ(currRoot, root); |
| } |
| } |
| } |