// 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.

// @dart = 2.9

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/minitest.dart';

import 'js_test_util.dart';

main() {
  injectJs();

  test('convert a List', () {
    final list = [1, 2, 3, 4, 5, 6, 7, 8];
    var array = new JsObject.jsify(list);
    expect(context.callMethod('isArray', [array]), isTrue);
    expect(array['length'], equals(list.length));
    for (var i = 0; i < list.length; i++) {
      expect(array[i], equals(list[i]));
    }
  });

  test('convert an Iterable', () {
    final set = new Set.from([1, 2, 3, 4, 5, 6, 7, 8]);
    var array = new JsObject.jsify(set);
    expect(context.callMethod('isArray', [array]), isTrue);
    expect(array['length'], equals(set.length));
    for (var i = 0; i < array['length']; i++) {
      expect(set.contains(array[i]), isTrue);
    }
  });

  test('convert a Map', () {
    var map = {
      'a': 1,
      'b': 2,
      'c': 3,
      'd': allowInteropCaptureThis((that) => 42)
    };
    var jsMap = new JsObject.jsify(map);
    expect(!context.callMethod('isArray', [jsMap]), isTrue);
    for (final key in map.keys) {
      expect(context.callMethod('checkMap', [jsMap, key, map[key]]), isTrue);
    }
  });

  test('deep convert a complex object', () {
    dynamic object = {
      'a': [
        1,
        [2, 3]
      ],
      'b': {
        'c': 3,
        'd': new JsObject(context['Foo'], [42])
      },
      'e': null
    };
    var jsObject = new JsObject.jsify(object);
    expect(jsObject['a'][0], equals(object['a'][0]));
    expect(jsObject['a'][1][0], equals(object['a'][1][0]));
    expect(jsObject['a'][1][1], equals(object['a'][1][1]));
    expect(jsObject['b']['c'], equals(object['b']['c']));
    expect(jsObject['b']['d'], equals(object['b']['d']));
    expect(jsObject['b']['d'].callMethod('bar'), equals(42));
    expect(jsObject['e'], isNull);
  });

  test('throws if object is not a Map or Iterable', () {
    expect(() => new JsObject.jsify('a'), throwsArgumentError);
  });
}
