|  | // Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | import 'package:kernel/src/union_find.dart'; | 
|  |  | 
|  | void testSame<T>(UnionFind<T> unionFind, T a, T b, bool expected) { | 
|  | expect(expected, unionFind.nodesInSameSet(unionFind[a], unionFind[b])); | 
|  | } | 
|  |  | 
|  | void testSets<T>(UnionFind<T> unionFind, Set<Set<T>> sets) { | 
|  | for (Set<T> set in sets) { | 
|  | UnionFindNode<T> root = unionFind.findNode(unionFind[set.first]); | 
|  | for (T value in unionFind.values) { | 
|  | testSame(unionFind, value, root.value, set.contains(value)); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | void testFind<T>(UnionFind<T> unionFind, T value, T expected) { | 
|  | expect(expected, unionFind.findNode(unionFind[value]).value); | 
|  | } | 
|  |  | 
|  | void testUnion<T>(UnionFind<T> unionFind, T a, T b, T expected) { | 
|  | expect(expected, unionFind.unionOfNodes(unionFind[a], unionFind[b]).value); | 
|  | } | 
|  |  | 
|  | void main() { | 
|  | UnionFind<int> unionFind = new UnionFind(); | 
|  | // {0} | 
|  | testFind(unionFind, 0, 0); | 
|  | testSame(unionFind, 0, 0, true); | 
|  | testSets(unionFind, { | 
|  | {0} | 
|  | }); | 
|  |  | 
|  | // {0}, {1} | 
|  | testFind(unionFind, 1, 1); | 
|  | testSame(unionFind, 0, 1, false); | 
|  | testSame(unionFind, 1, 0, false); | 
|  | testSame(unionFind, 1, 1, true); | 
|  | testSets(unionFind, { | 
|  | {0}, | 
|  | {1} | 
|  | }); | 
|  |  | 
|  | // {0}, {1}, {2} | 
|  | testFind(unionFind, 2, 2); | 
|  | testSame(unionFind, 0, 2, false); | 
|  | testSame(unionFind, 1, 2, false); | 
|  | testSame(unionFind, 2, 2, true); | 
|  | testSets(unionFind, { | 
|  | {0}, | 
|  | {1}, | 
|  | {2} | 
|  | }); | 
|  |  | 
|  | // {0}, {1}, {2} | 
|  | testUnion(unionFind, 0, 0, 0); | 
|  | testSame(unionFind, 0, 0, true); | 
|  | testSame(unionFind, 0, 1, false); | 
|  | testSame(unionFind, 0, 2, false); | 
|  | testSets(unionFind, { | 
|  | {0}, | 
|  | {1}, | 
|  | {2} | 
|  | }); | 
|  |  | 
|  | // {0, 1}, {2} | 
|  | testUnion(unionFind, 0, 1, 0); | 
|  | testSame(unionFind, 0, 0, true); | 
|  | testSame(unionFind, 0, 1, true); | 
|  | testSame(unionFind, 1, 0, true); | 
|  | testSame(unionFind, 0, 2, false); | 
|  | testFind(unionFind, 0, 0); | 
|  | testFind(unionFind, 1, 0); | 
|  | testSets(unionFind, { | 
|  | {0, 1}, | 
|  | {2} | 
|  | }); | 
|  |  | 
|  | // {0, 1}, {2, 3} | 
|  | testUnion(unionFind, 2, 3, 2); | 
|  | testSame(unionFind, 0, 0, true); | 
|  | testSame(unionFind, 0, 1, true); | 
|  | testSame(unionFind, 0, 2, false); | 
|  | testSame(unionFind, 0, 3, false); | 
|  | testSame(unionFind, 0, 0, true); | 
|  | testSame(unionFind, 0, 1, true); | 
|  | testSame(unionFind, 0, 2, false); | 
|  | testSame(unionFind, 0, 3, false); | 
|  | testFind(unionFind, 2, 2); | 
|  | testFind(unionFind, 3, 2); | 
|  | testSets(unionFind, { | 
|  | {0, 1}, | 
|  | {2, 3} | 
|  | }); | 
|  |  | 
|  | // {0, 1, 2, 3} | 
|  | testUnion(unionFind, 1, 2, 0); | 
|  | testSets(unionFind, { | 
|  | {0, 1, 2, 3} | 
|  | }); | 
|  | } | 
|  |  | 
|  | void expect(expected, actual) { | 
|  | if (expected != actual) throw 'Expected $expected, actual $actual'; | 
|  | } |