// Copyright (c) 2020, 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 'dart:html';

import 'package:expect/legacy/minitest.dart'; // ignore: deprecated_member_use_from_same_package

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