/*
 * Copyright (c) 2014, 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.
 */
/**
 * @assertion bool matches(String selectors)
 * Checks if this element matches the CSS selectors.
 * @description Checks various selectors
 */
import "dart:html";
import "../../../Utils/expect.dart";
import "../testcommon.dart";

main() {
  var e = new Element.html(
      '<div>'
      '<span>'
      '''<hr><pre
                                           id="myid"
                                           class="foo bar"
                                           lang="en">'''
      '</pre>'
      '</span>'
      '</div>',
      treeSanitizer: new NullTreeSanitizer());

  var x = e.querySelector('pre');
  if (x != null) {
    Expect.isTrue(x.matches('*'), 'Universal selector');
    Expect.isTrue(x.matches('pre'), 'Type selector');
    Expect.isFalse(x.matches('table'), 'Type selector, negative');
    Expect.isTrue(x.matches('span pre'), 'Descendant selector, direct');
    Expect.isTrue(x.matches('div pre'), 'Descendant selector, indirect');
    Expect.isTrue(x.matches('* pre'), 'Descendant selector, any');
    Expect.isTrue(x.matches('span > pre'), 'Child selector');
    Expect.isFalse(x.matches('div > pre'), 'Child selector, negative');
    Expect.isFalse(
        x.matches('pre:first-child'), 'The :first-child pseudo-class');
    Expect.isTrue(x.matches('pre:lang(en)'), 'The :lang() pseudo-class');
    Expect.isFalse(x.matches('pre:lang(fr)'), 'The :lang() pseudo-class');
    Expect.isTrue(x.matches('hr + pre'), 'Adjacent selector');
    Expect.isFalse(x.matches('div + pre'), 'Adjacent selector, negative');
    Expect.isTrue(x.matches('pre[id]'), 'Attribute selector 1');
    Expect.isFalse(x.matches('pre[foo]'), 'Attribute selector 1, negative');
    Expect.isTrue(x.matches('pre[id="myid"]'), 'Attribute selector 2');
    Expect.isFalse(
        x.matches('pre[id="myid2"]'), 'Attribute selector 2, negative');
    Expect.isTrue(x.matches('pre[class~="bar"]'), 'Attribute selector 3');
    Expect.isFalse(
        x.matches('pre[class~="baz"]'), 'Attribute selector 3, negative');
    Expect.isTrue(x.matches('pre[lang|="en"]'), 'Attribute selector 4');
    Expect.isFalse(
        x.matches('pre[lang|="fr"]'), 'Attribute selector 4, negative');
    Expect.isTrue(x.matches('pre.foo'), 'Class selector');
    Expect.isFalse(x.matches('pre.baz'), 'Class selector, negative');
    Expect.isTrue(x.matches('pre#myid'), 'Id selector');
    Expect.isFalse(x.matches('pre#baz'), 'Id selector, negative');
  } else {
    Expect.fail("Element was not found");
  }
}
