import 'dart:html';

import 'package:expect/minitest.dart';

main() {
  var isRectList =
      predicate((x) => x is DomRectList, 'should be a DomRectList');
  var isListOfRectangle =
      predicate((x) => x is List<Rectangle>, 'should be a List<Rectangle>');

  var isRectangle = predicate((x) => x is Rectangle, 'should be a Rectangle');
  var isDomRectReadOnly =
      predicate((x) => x is DomRectReadOnly, 'should be a DomRectReadOnly');

  insertTestDiv() {
    var element = new Element.tag('div');
    element.innerHtml = r'''
    A large block of text should go here. Click this
    block of text multiple times to see each line
    highlight with every click of the mouse button.
    ''';
    document.body.append(element);
    return element;
  }

  test("DomRectList test", () {
    insertTestDiv();
    var range = new Range();
    var rects = range.getClientRects();
    expect(rects, isListOfRectangle);
    expect(rects, isRectList);
  });

  test("ClientRect ==", () {
    var rect1 = document.body.getBoundingClientRect();
    var rect2 = document.body.getBoundingClientRect();
    expect(rect1, isRectangle);
    expect(rect1, isDomRectReadOnly);
    expect(rect1, equals(rect2));
  });
}
