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

import 'utils.dart';

main() {
  test('InnerHTML', () {
    Element element = new Element.tag('div');
    element.id = 'test';
    element.innerHtml = 'Hello World';
    document.body!.append(element);

    element = document.querySelector('#test')!;
    expect(element.innerHtml, 'Hello World');
    element.remove();
  });
  test('HTMLTable', () {
    TableElement table = new Element.tag('table') as TableElement;

    TableRowElement row = new Element.tag('tr') as TableRowElement;
    table.append(row);

    row.append(new Element.tag('td'));
    row.append(new Element.tag('td'));

    expect(row.cells.length, 2);

    TableRowElement headerRow = table.rows[0];
    expect(headerRow.cells.length, 2);
  });
  test('dataset', () {
    Element div = new Element.tag('div');

    expect(div.dataset.isEmpty, isTrue);
    expect(div.dataset['foo'], isNull);
    expect(div.dataset.isEmpty, isTrue);

    div.dataset['foo'] = 'foo-value';
    expect(div.dataset['foo'], 'foo-value');
    expect(div.dataset.isEmpty, isFalse);

    expect(div.dataset.containsValue('foo-value'), isTrue);
    expect(div.dataset.containsValue('bar-value'), isFalse);
    expect(div.dataset.containsKey('foo'), isTrue);
    expect(div.dataset.containsKey('bar'), isFalse);

    bool hasBeenInvoked;
    String f() {
      hasBeenInvoked = true;
      return 'bar-value';
    }

    hasBeenInvoked = false;
    expect(div.dataset.putIfAbsent('bar', f), 'bar-value');
    expect(hasBeenInvoked, isTrue);

    hasBeenInvoked = false;
    expect(div.dataset.putIfAbsent('bar', f), 'bar-value');
    expect(hasBeenInvoked, isFalse);

    final keys = <String>[];
    final values = <String>[];
    div.dataset.forEach((String key, String value) {
      keys.add(key);
      values.add(value);
    });
    expect(keys, unorderedEquals(['foo', 'bar']));
    expect(values, unorderedEquals(['foo-value', 'bar-value']));

    expect(
      new List<String>.from(div.dataset.keys),
      unorderedEquals(['foo', 'bar']),
    );
    expect(
      new List<String>.from(div.dataset.values),
      unorderedEquals(['foo-value', 'bar-value']),
    );

    expect(div.dataset.length, 2);
    expect(div.dataset.isEmpty, isFalse);

    expect(div.dataset.remove('qux'), isNull);
    expect(div.dataset.length, 2);
    expect(div.dataset.isEmpty, isFalse);

    expect(div.dataset.remove('foo'), 'foo-value');
    expect(div.dataset.length, 1);
    expect(div.dataset.isEmpty, isFalse);

    div.dataset.clear();
    expect(div.dataset.length, 0);
    expect(div.dataset.isEmpty, isTrue);

    Element otherDiv = new Element.html(
      '<div id="dataDiv" data-my-message="Hello World"></div>',
      treeSanitizer: new NullTreeSanitizer(),
    );
    expect(otherDiv.dataset.containsKey('myMessage'), isTrue);

    Element anotherDiv = new Element.html(
      '<div id="dataDiv" data-eggs="bacon"></div>',
      treeSanitizer: new NullTreeSanitizer(),
    );
    expect(anotherDiv.dataset.containsKey('eggs'), isTrue);
  });
}
