// Copyright (c) 2012, 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.

library XMLDocumentTest;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:html';

main() {
  useHtmlConfiguration();

  var isXMLDocument = predicate((x) => x is XMLDocument, 'is an XMLDocument');
  var isXMLElement = predicate((x) => x is XMLElement, 'is an XMLElement');

  XMLDocument makeDocument() => new XMLDocument.xml("<xml><foo/><bar/></xml>");

  group('constructor', () {
    test('with a well-formed document', () {
      final doc = makeDocument();
      expect(doc, isXMLDocument);
      expect(doc.children[0].tagName, 'foo');
      expect(doc.children[1].tagName, 'bar');
    });

    // TODO(nweiz): re-enable this when Document#query matches the root-level
    // element. Otherwise it fails on Firefox.
    //
    // test('with a parse error', () {
    //   expect(() => new XMLDocument.xml("<xml></xml>foo"),
    //       throwsArgumentError);
    // });

    test('with a PARSERERROR tag', () {
      final doc = new XMLDocument.xml("<xml><parsererror /></xml>");
      expect(doc.children[0].tagName, 'parsererror');
    });
  });

  // FilteredElementList is tested more thoroughly in DocumentFragmentTests.
  group('children', () {
    test('filters out non-element nodes', () {
      final doc = new XMLDocument.xml("<xml>1<a/><b/>2<c/>3<d/></xml>");
      expect(doc.children.map((e) => e.tagName), ["a", "b", "c", "d"]);
    });

    test('overwrites nodes when set', () {
      final doc = new XMLDocument.xml("<xml>1<a/><b/>2<c/>3<d/></xml>");
      doc.children = [new XMLElement.tag('x'), new XMLElement.tag('y')];
      expect(doc.outerHtml, "<xml><x></x><y></y></xml>");
    });
  });

  group('classes', () {
    XMLDocument makeDocumentWithClasses() =>
      new XMLDocument.xml("<xml class='foo bar baz'></xml>");

    Set<String> makeClassSet() => makeDocumentWithClasses().classes;

    Set<String> extractClasses(Document doc) {
      final match = new RegExp('class="([^"]+)"').firstMatch(doc.outerHtml);
      return new Set.from(match[1].split(' '));
    }

    test('affects the "class" attribute', () {
      final doc = makeDocumentWithClasses();
      doc.classes.add('qux');
      expect(extractClasses(doc), ["foo", "bar", "baz", "qux"]);
    });

    test('is affected by the "class" attribute', () {
      final doc = makeDocumentWithClasses();
      doc.attributes['class'] = 'foo qux';
      expect(doc.classes, ["foo", "qux"]);
    });

    test('classes=', () {
      final doc = makeDocumentWithClasses();
      doc.classes = ['foo', 'qux'];
      expect(doc.classes, ["foo", "qux"]);
      expect(extractClasses(doc), ["foo", "qux"]);
    });

    test('toString', () {
      expect(makeClassSet().toString().split(' '),
          unorderedEquals(['foo', 'bar', 'baz']));
      expect(makeDocument().classes.toString(), '');
    });

    test('forEach', () {
      final classes = <String>[];
      makeClassSet().forEach(classes.add);
      expect(classes, unorderedEquals(['foo', 'bar', 'baz']));
    });

    test('iterator', () {
      final classes = <String>[];
      for (var doc in makeClassSet()) {
        classes.add(doc);
      }
      expect(classes, unorderedEquals(['foo', 'bar', 'baz']));
    });

    test('map', () {
      expect(makeClassSet().map((c) => c.toUpperCase()),
          unorderedEquals(['FOO', 'BAR', 'BAZ']));
    });

    test('filter', () {
      expect(makeClassSet().filter((c) => c.contains('a')),
          unorderedEquals(['bar', 'baz']));
    });

    test('every', () {
      expect(makeClassSet().every((c) => c is String), isTrue);
      expect(makeClassSet().every((c) => c.contains('a')), isFalse);
    });

    test('some', () {
      expect(makeClassSet().some((c) => c.contains('a')), isTrue);
      expect(makeClassSet().some((c) => c is num), isFalse);
    });

    test('isEmpty', () {
      expect(makeClassSet().isEmpty, isFalse);
      expect(makeDocument().classes.isEmpty, isTrue);
    });

    test('length', () {
      expect(makeClassSet().length, 3);
      expect(makeDocument().classes.length, 0);
    });

    test('contains', () {
      expect(makeClassSet().contains('foo'), isTrue);
      expect(makeClassSet().contains('qux'), isFalse);
    });

    test('add', () {
      final classes = makeClassSet();
      classes.add('qux');
      expect(classes, unorderedEquals(['foo', 'bar', 'baz', 'qux']);

      classes.add('qux');
      final list = new List.from(classes);
      list.sort((a, b) => a.compareTo(b));
      expect(list, ['bar', 'baz', 'foo', 'qux'],
          reason: "The class set shouldn't have duplicate elements.");
    });

    test('remove', () {
      final classes = makeClassSet();
      classes.remove('bar');
      expect(classes, unorderedEquals(['foo', 'baz']));
      classes.remove('qux');
      expect(classes, unorderedEquals(['foo', 'baz']));
    });

    test('addAll', () {
      final classes = makeClassSet();
      classes.addAll(['bar', 'qux', 'bip']);
      expect(classes, unorderedEquals(['foo', 'bar', 'baz', 'qux', 'bip']));
    });

    test('removeAll', () {
      final classes = makeClassSet();
      classes.removeAll(['bar', 'baz', 'qux']);
      expect(classes, ['foo']);
    });

    test('isSubsetOf', () {
      final classes = makeClassSet();
      expect(classes.isSubsetOf(['foo', 'bar', 'baz']), isTrue);
      expect(classes.isSubsetOf(['foo', 'bar', 'baz', 'qux']), isTrue);
      expect(classes.isSubsetOf(['foo', 'bar', 'qux']), isFalse);
    });

    test('containsAll', () {
      final classes = makeClassSet();
      expect(classes.containsAll(['foo', 'baz']), isTrue);
      expect(classes.containsAll(['foo', 'qux']), isFalse);
    });

    test('intersection', () {
      final classes = makeClassSet();
      expect(classes.intersection(['foo', 'qux', 'baz']),
          unorderedEquals(['foo', 'baz']))
    });

    test('clear', () {
      final classes = makeClassSet();
      classes.clear();
      expect(classes, []);
    });
  });

  // XMLClassSet is tested more thoroughly in XMLElementTests.
  group('classes', () {
    XMLDocument makeDocumentWithClasses() =>
      new XMLDocument.xml("<xml class='foo bar baz'></xml>");

    test('affects the "class" attribute', () {
      final doc = makeDocumentWithClasses();
      doc.classes.add('qux');
      expect(doc.attributes['class'].split(' '),
          unorderedEquals(['foo', 'bar', 'baz', 'qux']));
    });

    test('is affected by the "class" attribute', () {
      final doc = makeDocumentWithClasses();
      doc.attributes['class'] = 'foo qux';
      expect(doc.classes, unorderedEquals(['foo', 'qux']));
    });
  });

  test("no-op methods don't throw errors", () {
    final doc = makeDocument();
    doc.on.click.add((e) => null);
    doc.blur();
    doc.focus();
    doc.scrollByLines(2);
    doc.scrollByPages(2);
    doc.scrollIntoView();
    expect(doc.execCommand("foo", false, "bar"), isFalse);
  });

  group('properties that map to attributes', () {
    group('contentEditable', () {
      test('get', () {
        final doc = makeDocument();
        expect(doc.contentEditable, 'inherit');
        doc.attributes['contentEditable'] = 'foo';
        expect(doc.contentEditable, 'foo');
      });

      test('set', () {
        final doc = makeDocument();
        doc.contentEditable = 'foo';
        expect(doc.attributes['contentEditable'], 'foo');
      });

      test('isContentEditable', () {
        final doc = makeDocument();
        expect(doc.isContentEditable, isFalse);
        doc.contentEditable = 'true';
        expect(doc.isContentEditable, isFalse);
      });
    });

    group('draggable', () {
      test('get', () {
        final doc = makeDocument();
        expect(doc.draggable, isFalse);
        doc.attributes['draggable'] = 'true';
        expect(doc.draggable, isTrue);
        doc.attributes['draggable'] = 'foo';
        expect(doc.draggable, isFalse);
      });

      test('set', () {
        final doc = makeDocument();
        doc.draggable = true;
        expect(doc.attributes['draggable'], 'true');
        doc.draggable = false;
        expect(doc.attributes['draggable'], 'false');
      });
    });

    group('spellcheck', () {
      test('get', () {
        final doc = makeDocument();
        expect(doc.spellcheck, isFalse);
        doc.attributes['spellcheck'] = 'true';
        expect(doc.spellcheck, isTrue);
        doc.attributes['spellcheck'] = 'foo';
        expect(doc.spellcheck, isFalse);
      });

      test('set', () {
        final doc = makeDocument();
        doc.spellcheck = true;
        expect(doc.attributes['spellcheck'], 'true');
        doc.spellcheck = false;
        expect(doc.attributes['spellcheck'], 'false');
      });
    });

    group('hidden', () {
      test('get', () {
        final doc = makeDocument();
        expect(doc.hidden, isFalse);
        doc.attributes['hidden'] = '';
        expect(doc.hidden, isTrue);
      });

      test('set', () {
        final doc = makeDocument();
        doc.hidden = true;
        expect(doc.attributes['hidden'], '');
        doc.hidden = false;
        expect(doc.attributes.containsKey('hidden'), isFalse);
      });
    });

    group('tabIndex', () {
      test('get', () {
        final doc = makeDocument();
        expect(doc.tabIndex, 0);
        doc.attributes['tabIndex'] = '2';
        expect(doc.tabIndex, 2);
        doc.attributes['tabIndex'] = 'foo';
        expect(doc.tabIndex, 0);
      });

      test('set', () {
        final doc = makeDocument();
        doc.tabIndex = 15;
        expect(doc.attributes['tabIndex'], '15');
      });
    });

    group('id', () {
      test('get', () {
        final doc = makeDocument();
        expect(doc.id, '');
        doc.attributes['id'] = 'foo';
        expect(doc.id, 'foo');
      });

      test('set', () {
        final doc = makeDocument();
        doc.id = 'foo';
        expect(doc.attributes['id'], 'foo');
      });
    });

    group('title', () {
      test('get', () {
        final doc = makeDocument();
        expect(doc.title, '');
        doc.attributes['title'] = 'foo';
        expect(doc.title, 'foo');
      });

      test('set', () {
        final doc = makeDocument();
        doc.title = 'foo';
        expect(doc.attributes['title'], 'foo');
      });
    });

    // TODO(nweiz): re-enable this when the WebKit-specificness won't break
    // non-WebKit browsers.
    //
    // group('webkitdropzone', () {
    //   test('get', () {
    //     final doc = makeDocument();
    //     expect(doc.webkitdropzone, '');
    //     doc.attributes['webkitdropzone'] = 'foo';
    //     expect(doc.webkitdropzone, 'foo');
    //   });
    //
    //   test('set', () {
    //     final doc = makeDocument();
    //     doc.webkitdropzone = 'foo';
    //     expect(doc.attributes['webkitdropzone'], 'foo');
    //   });
    // });

    group('lang', () {
      test('get', () {
        final doc = makeDocument();
        expect(doc.lang, '');
        doc.attributes['lang'] = 'foo';
        expect(doc.lang, 'foo');
      });

      test('set', () {
        final doc = makeDocument();
        doc.lang = 'foo';
        expect(doc.attributes['lang'], 'foo');
      });
    });

    group('dir', () {
      test('get', () {
        final doc = makeDocument();
        expect(doc.dir, '');
        doc.attributes['dir'] = 'foo';
        expect(doc.dir, 'foo');
      });

      test('set', () {
        final doc = makeDocument();
        doc.dir = 'foo';
        expect(doc.attributes['dir'], 'foo');
      });
    });
  });

  test('set innerHtml', () {
    final doc = makeDocument();
    doc.innerHtml = "<foo>Bar<baz/></foo>";
    expect(doc.nodes.length, 1);
    final node = doc.nodes[0];
    expect(node, isXMLElement);
    expect(node.tagName, 'foo');
    expect(node.nodes[0].text, 'Bar');
    expect(node.nodes[1].tagName, 'baz');
  });

  test('get innerHtml/outerHtml', () {
    final doc = makeDocument();
    expect(doc.innerHtml, "<foo></foo><bar></bar>");
    doc.nodes.clear();
    doc.nodes.addAll([new Text("foo"), new XMLElement.xml("<a>bar</a>")]);
    expect(doc.innerHtml, "foo<a>bar</a>");
    expect(doc.outerHtml, "<xml>foo<a>bar</a></xml>");
  });

  test('query', () {
    final doc = makeDocument();
    expect(doc.query('foo').tagName, 'foo');
    expect(doc.query('baz'), isNull);
  });

  test('queryAll', () {
    final doc = new XMLDocument.xml(
        "<xml><foo id='f1' /><bar><foo id='f2' /></bar></xml>");
    expect(doc.queryAll('foo').map((e) => e.id), ['f1', 'f2']);
    expect(doc.queryAll('baz'), []);
  });

  // TODO(nweiz): re-enable this when matchesSelector works cross-browser.
  //
  // test('matchesSelector', () {
  //   final doc = makeDocument();
  //   expect(doc.matchesSelector('*'), isTrue);
  //   expect(doc.matchesSelector('xml'), isTrue);
  //   expect(doc.matchesSelector('html'), isFalse);
  // });

  group('insertAdjacentElement', () {
    getDoc() => new XMLDocument.xml("<xml><a>foo</a></xml>");

    test('beforeBegin does nothing', () {
      final doc = getDoc();
      expect(doc.insertAdjacentElement("beforeBegin", new XMLElement.tag("b")),
          isNull);
      expect(doc.innerHtml, "<a>foo</a>");
    });

    test('afterEnd does nothing', () {
      final doc = getDoc();
      expect(doc.insertAdjacentElement("afterEnd", new XMLElement.tag("b")),
          isNull);
      expect(doc.innerHtml, "<a>foo</a>");
    });

    test('afterBegin inserts the element', () {
      final doc = getDoc();
      final el = new XMLElement.tag("b");
      expect(doc.insertAdjacentElement("afterBegin", el), el);
      expect(doc.innerHtml, "<b></b><a>foo</a>");
    });

    test('beforeEnd inserts the element', () {
      final doc = getDoc();
      final el = new XMLElement.tag("b");
      expect(doc.insertAdjacentElement("beforeEnd", el), el);
      expect(doc.innerHtml, "<a>foo</a><b></b>");
    });
  });

  group('insertAdjacentText', () {
    getDoc() => new XMLDocument.xml("<xml><a>foo</a></xml>");

    test('beforeBegin does nothing', () {
      final doc = getDoc();
      doc.insertAdjacentText("beforeBegin", "foo");
      expect(doc.innerHtml, "<a>foo</a>");
    });

    test('afterEnd does nothing', () {
      final doc = getDoc();
      doc.insertAdjacentText("afterEnd", "foo");
      expect(doc.innerHtml, "<a>foo</a>");
    });

    test('afterBegin inserts the text', () {
      final doc = getDoc();
      doc.insertAdjacentText("afterBegin", "foo");
      expect(doc.innerHtml, "foo<a>foo</a>");
    });

    test('beforeEnd inserts the text', () {
      final doc = getDoc();
      doc.insertAdjacentText("beforeEnd", "foo");
      expect(doc.innerHtml, "<a>foo</a>foo");
    });
  });

  group('insertAdjacentHtml', () {
    getDoc() => new XMLDocument.xml("<xml><a>foo</a></xml>");

    test('beforeBegin does nothing', () {
      final doc = getDoc();
      doc.insertAdjacentHtml("beforeBegin", "foo<b/>");
      expect(doc.innerHtml, "<a>foo</a>");
    });

    test('afterEnd does nothing', () {
      final doc = getDoc();
      doc.insertAdjacentHtml("afterEnd", "<b/>foo");
      expect(doc.innerHtml, "<a>foo</a>");
    });

    test('afterBegin inserts the HTML', () {
      final doc = getDoc();
      doc.insertAdjacentHtml("afterBegin", "foo<b/>");
      expect(doc.innerHtml, "foo<b></b><a>foo</a>");
    });

    test('beforeEnd inserts the HTML', () {
      final doc = getDoc();
      doc.insertAdjacentHtml("beforeEnd", "<b/>foo");
      expect(doc.innerHtml, "<a>foo</a><b></b>foo");
    });
  });

  group('default values', () {
    test('default rect values', () {
      makeDocument().rect.then(expectAsync1((ElementRect rect) {
        expectEmptyRect(rect.client);
        expectEmptyRect(rect.offset);
        expectEmptyRect(rect.scroll);
        expectEmptyRect(rect.bounding);
        expect(rect.clientRects.isEmpty, isTrue);
      }));
    });

    test('nextElementSibling', () =>
        expect(makeDocument().nextElementSibling), isNull);
    test('previousElementSibling', () =>
        expect(makeDocument().previousElementSibling), isNull);
    test('parent', () => expect(makeDocument().parent), isNull);
    test('offsetParent', () => expect(makeDocument().offsetParent), isNull);
    test('activeElement', () => expect(makeDocument().activeElement), isNull);
    test('body', () => expect(makeDocument().body), isNull);
    test('window', () => expect(makeDocument().window), isNull);
    test('domain', () => expect(makeDocument().domain), '');
    test('head', () => expect(makeDocument().head), isNull);
    test('referrer', () => expect(makeDocument().referrer), '');
    test('styleSheets', () => expect(makeDocument().styleSheets), []);
    test('title', () => expect(makeDocument().title), '');

    // TODO(nweiz): IE sets the charset to "windows-1252". How do we want to
    // handle that?
    //
    // test('charset', () => expect(makeDocument().charset), isNull);

    // TODO(nweiz): re-enable these when the WebKit-specificness won't break
    // non-WebKit browsers.
    //
    // test('webkitHidden', () => expect(makeDocument().webkitHidden), isFalse);
    // test('webkitVisibilityState', () =>
    //     expect(makeDocument().webkitVisibilityState), 'visible');

    test('caretRangeFromPoint', () {
      final doc = makeDocument();
      Futures.wait([
        doc.caretRangeFromPoint(),
        doc.caretRangeFromPoint(0, 0),
        doc.caretRangeFromPoint(5, 5)
      ]).then(expectAsync1((ranges) {
        expect(ranges, [null, null, null]);
      }));
    });

    test('elementFromPoint', () {
      final doc = makeDocument();
      Futures.wait([
        doc.elementFromPoint(),
        doc.elementFromPoint(0, 0),
        doc.elementFromPoint(5, 5)
      ]).then(expectAsync1((ranges) {
        expect(ranges, [null, null, null]);
      }));
    });

    test('queryCommandEnabled', () {
      expect(makeDocument().queryCommandEnabled('foo'), isFalse);
      expect(makeDocument().queryCommandEnabled('bold'), isFalse);
    });

    test('queryCommandIndeterm', () {
      expect(makeDocument().queryCommandIndeterm('foo'), isFalse);
      expect(makeDocument().queryCommandIndeterm('bold'), isFalse);
    });

    test('queryCommandState', () {
      expect(makeDocument().queryCommandState('foo'), isFalse);
      expect(makeDocument().queryCommandState('bold'), isFalse);
    });

    test('queryCommandSupported', () {
      expect(makeDocument().queryCommandSupported('foo'), isFalse);
      expect(makeDocument().queryCommandSupported('bold'), isFalse);
    });

    test('manifest', () => expect(makeDocument().manifest), '');
  });

  test('unsupported operations', () {
    expectUnsupported(() { makeDocument().body = new XMLElement.tag('xml'); });
    expectUnsupported(() => makeDocument().cookie);
    expectUnsupported(() { makeDocument().cookie = 'foo'; });
    expectUnsupported(() { makeDocument().manifest = 'foo'; });
  });
}
