| /* | |
| * 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); | |
| } | |
| } | |
| } |