import 'package:nc_photos/list_extension.dart';
import 'package:quiver/core.dart';
import 'package:test/test.dart';

void main() {
  group("ListExtension", () {
    group("distinct", () {
      test("primitive", () {
        expect([1, 2, 3, 4, 5, 3, 2, 4, 6].distinct(), [1, 2, 3, 4, 5, 6]);
      });

      test("class", () {
        expect(
            [
              _DistinctTest(1, 1),
              _DistinctTest(2, 2),
              _DistinctTest(3, 3),
              _DistinctTest(4, 4),
              _DistinctTest(5, 4),
              _DistinctTest(3, 6),
              _DistinctTest(2, 2),
              _DistinctTest(4, 8),
              _DistinctTest(6, 9),
            ].distinct(),
            [
              _DistinctTest(1, 1),
              _DistinctTest(2, 2),
              _DistinctTest(3, 3),
              _DistinctTest(4, 4),
              _DistinctTest(5, 4),
              _DistinctTest(3, 6),
              _DistinctTest(4, 8),
              _DistinctTest(6, 9),
            ]);
      });
    });

    test("distinctIf", () {
      expect(
          [
            _DistinctTest(1, 1),
            _DistinctTest(2, 2),
            _DistinctTest(3, 3),
            _DistinctTest(4, 4),
            _DistinctTest(5, 5),
            _DistinctTest(3, 6),
            _DistinctTest(2, 7),
            _DistinctTest(4, 8),
            _DistinctTest(6, 9),
          ].distinctIf((a, b) => a.x == b.x, (a) => a.x),
          [
            _DistinctTest(1, 1),
            _DistinctTest(2, 2),
            _DistinctTest(3, 3),
            _DistinctTest(4, 4),
            _DistinctTest(5, 5),
            _DistinctTest(6, 9),
          ]);
    });

    test("takeIndex", () {
      expect([1, 2, 3, 4, 5, 6].takeIndex([5, 4, 3, 1, 0]), [6, 5, 4, 2, 1]);
    });
  });
}

class _DistinctTest {
  _DistinctTest(this.x, this.y);

  @override
  operator ==(Object other) =>
      other is _DistinctTest && x == other.x && y == other.y;

  @override
  get hashCode => hash2(x, y);

  @override
  toString() => "{x: $x, y: $y}";

  final int x;
  final int y;
}