// Copyright 2015 Google. All rights reserved. Use of this source code is
// governed by a BSD-style license that can be found in the LICENSE file.

@TestOn('vm')
library wip.console_test;

import 'package:test/test.dart';
import 'package:webkit_inspection_protocol/dom_model.dart';
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';

import 'test_setup.dart';

void main() {
  group('WipDomModel', () {
    WipDom dom;

    setUp(() async {
      dom = new WipDomModel((await navigateToPage('dom_model_test.html')).dom);
    });

    tearDown(() async {
      dom = null;
      await closeConnection();
    });

    test('maintains model across getDocument calls', () async {
      var document1 = await dom.getDocument();
      var document2 = await dom.getDocument();
      expect(document2.nodeId, document1.nodeId);
    });

    test('requestChildNodes updates children', () async {
      Node htmlNode = (await dom.getDocument()).children[1];
      for (var child in htmlNode.children) {
        expect(child.children, isNull);
        await dom.requestChildNodes(child.nodeId);
      }
      // wait for children to be updated
      for (var child in htmlNode.children) {
        expect(child.children, isNotNull);
      }
    });

    test('removing a node updates children', () async {
      Node bodyNode = (await dom.getDocument()).children[1].children[1];
      await dom.requestChildNodes(bodyNode.nodeId);
      var childCount = bodyNode.childNodeCount;
      await dom.removeNode(bodyNode.children.first.nodeId);

      expect(bodyNode.children, hasLength(childCount - 1));
      expect(bodyNode.childNodeCount, childCount - 1);
    });

    test('Moving a node updates children', () async {
      Node bodyNode = (await dom.getDocument()).children[1].children[1];
      await dom.requestChildNodes(bodyNode.nodeId);
      Node div1 = bodyNode.children[0];
      Node div2 = bodyNode.children[1];

      expect(div1.childNodeCount, 1);
      expect(div2.childNodeCount, 0);

      await dom.requestChildNodes(div1.nodeId);
      await dom.requestChildNodes(div2.nodeId);

      await dom.moveTo(div1.children.first.nodeId, div2.nodeId);

      expect(div1.childNodeCount, 0);
      expect(div2.childNodeCount, 1);
      expect(div2.children, hasLength(1));
    }, skip: 'google/webkit_inspection_protocol.dart/issues/52');

    test('Setting node value updates value', () async {
      Node bodyNode = (await dom.getDocument()).children[1].children[1];
      await dom.requestChildNodes(bodyNode.nodeId);

      Node div1 = bodyNode.children[0];
      await dom.requestChildNodes(div1.nodeId);

      Node h1 = div1.children[0];
      await dom.requestChildNodes(h1.nodeId);

      Node text = h1.children[0];

      expect(text.nodeValue, 'test');

      await dom.setNodeValue(text.nodeId, 'some new text');

      expect(text.nodeValue, 'some new text');
    });

    test('Adding attribute updates attributes', () async {
      Node bodyNode = (await dom.getDocument()).children[1].children[1];
      expect(bodyNode.attributes.containsKey('my-attr'), isFalse);
      await dom.setAttributeValue(bodyNode.nodeId, 'my-attr', 'my-value');
      expect(bodyNode.attributes['my-attr'], 'my-value');
    });

    test('Changing attribute updates attributes', () async {
      Node bodyNode = (await dom.getDocument()).children[1].children[1];
      expect(bodyNode.attributes['test-attr'], 'test-attr-value');
      await dom.setAttributeValue(bodyNode.nodeId, 'test-attr', 'my-value');
      expect(bodyNode.attributes['test-attr'], 'my-value');
    });

    test('Removing attribute updates attributes', () async {
      Node bodyNode = (await dom.getDocument()).children[1].children[1];
      expect(bodyNode.attributes['test-attr'], 'test-attr-value');
      await dom.removeAttribute(bodyNode.nodeId, 'test-attr');
      expect(bodyNode.attributes.containsKey('test-attr'), isFalse);
    });

    test('refreshing resets document', () async {
      var document1 = await dom.getDocument();
      await navigateToPage('dom_model_test.html');
      var document2 = await dom.getDocument();
      expect(document2.nodeId, isNot(document1.nodeId));
    });

    test('getting attributes works', () async {
      Node bodyNode = (await dom.getDocument()).children[1].children[1];
      var attributes = bodyNode.attributes;
      var getAttributes = await dom.getAttributes(bodyNode.nodeId);

      expect(getAttributes, attributes);
      expect(bodyNode.attributes, attributes);
    }, skip: 'google/webkit_inspection_protocol.dart/issues/52');
  });
}
