// 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';
}
