// Copyright (c) 2013, 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 'dart:indexed_db' show IdbFactory, KeyRange;
import 'dart:typed_data' show Int32List;
import 'dart:js';

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

import 'js_test_util.dart';

main() {
  injectJs();

  test('DateTime', () {
    var date = context.callMethod('getNewDate');
    expect(date is DateTime, isTrue);
  });

  test('window', () {
    expect(context['window'] is Window, isTrue);
  });

  test('foreign browser objects should be proxied', () {
    var iframe = new IFrameElement();
    document.body!.children.add(iframe);
    var proxy = new JsObject.fromBrowserObject(iframe);

    // Window
    var contentWindow = proxy['contentWindow'];
    expect(contentWindow is! Window, isTrue);
    expect(contentWindow is JsObject, isTrue);

    // Node
    var foreignDoc = contentWindow['document'];
    expect(foreignDoc is! Node, isTrue);
    expect(foreignDoc is JsObject, isTrue);

    // Event
    var clicked = false;
    foreignDoc['onclick'] = (e) {
      expect(e is! Event, isTrue);
      expect(e is JsObject, isTrue);
      clicked = true;
    };

    context.callMethod('fireClickEvent', [contentWindow]);
    expect(clicked, isTrue);
  });

  test('foreign functions pass function is checks', () {
    var iframe = new IFrameElement();
    document.body!.children.add(iframe);
    var proxy = new JsObject.fromBrowserObject(iframe);

    var contentWindow = proxy['contentWindow'];
    var foreignDoc = contentWindow['document'];

    // Function
    var foreignFunction = foreignDoc['createElement'];
    expect(foreignFunction is JsFunction, isTrue);

    // Verify that internal isChecks in callMethod work.
    foreignDoc.callMethod('createElement', ['div']);

    var typedContentWindow = js_util.getProperty(iframe, 'contentWindow');
    var typedForeignDoc = js_util.getProperty(typedContentWindow, 'document');

    var typedForeignFunction = js_util.getProperty(
      typedForeignDoc,
      'createElement',
    );
    expect(typedForeignFunction is Function, isTrue);
    js_util.callMethod(typedForeignDoc, 'createElement', ['div']);
  });

  test('document', () {
    expect(context['document'] is Document, isTrue);
  });

  skipIE9_test('Blob', () {
    var blob = context.callMethod('getNewBlob');
    expect(blob is Blob, isTrue);
    expect(blob.type, equals('text/html'));
  });

  test('unattached DivElement', () {
    var node = context.callMethod('getNewDivElement');
    expect(node is DivElement, isTrue);
  });

  test('Event', () {
    var event = context.callMethod('getNewEvent');
    expect(event is Event, true);
  });

  test('KeyRange', () {
    if (IdbFactory.supported) {
      var node = context.callMethod('getNewIDBKeyRange');
      expect(node is KeyRange, isTrue);
    }
  });

  test('ImageData', () {
    var node = context.callMethod('getNewImageData');
    expect(node is ImageData, isTrue);
  });

  test('typed data: Int32Array', () {
    if (Platform.supportsTypedData) {
      var list = context.callMethod('getNewInt32Array');
      print(list);
      expect(list is Int32List, isTrue);
      expect(list, equals([1, 2, 3, 4, 5, 6, 7, 8]));
    }
  });
}
