/*
 * 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 ElementList querySelectorAll(String selectors)
 * Finds all descendent elements of this element that match the specified
 * group of selectors.
 *
 * selectors should be a string using CSS selector syntax.
 * @description Checks various selectors (not exhaustive)
 */
import "dart:html";
import "../../../Utils/expect.dart";
import "../testcommon.dart";

main() {
  var html = '';
  for (var x in [1, 2]) {
    html = '<div>'
        '<span>'
        '''<hr><pre
                           id="myid"
                           class="foo bar"
                           lang="en">'''
        '$html' // include itself
        '</pre>'
        '</span>'
        '</div>';
  }

  var e = new Element.html(html, treeSanitizer: new NullTreeSanitizer());
  document.body?.append(e);

  testTrue(list, testName) {
    Expect.equals(2, list.length, testName);
    Expect.isTrue(list[0] is PreElement, '$testName arg0');
    Expect.isTrue(list[1] is PreElement, '$testName arg1');
  }

  testFalse(list, testName) {
    Expect.listEquals([], list, testName);
  }

  testTrue(document.querySelectorAll('pre'), 'Type selector');

  testFalse(document.querySelectorAll('table'), 'Type selector, negative');

  testTrue(
      document.querySelectorAll('span pre'), 'Descendant selector, direct');

  testTrue(
      document.querySelectorAll('div pre'), 'Descendant selector, indirect');

  testTrue(document.querySelectorAll('* pre'), 'Descendant selector, any');

  testTrue(document.querySelectorAll('span > pre'), 'Child selector');

  testFalse(document.querySelectorAll('div > pre'), 'Child selector, negative');

  testFalse(document.querySelectorAll('pre:first-child'),
      'The :first-child pseudo-class');

  testTrue(
      document.querySelectorAll('pre:lang(en)'), 'The :lang() pseudo-class');

  testFalse(
      document.querySelectorAll('pre:lang(fr)'), 'The :lang() pseudo-class');

  testTrue(document.querySelectorAll('hr + pre'), 'Adjacent selector');

  testFalse(
      document.querySelectorAll('div + pre'), 'Adjacent selector, negative');

  testTrue(document.querySelectorAll('pre[id]'), 'Attribute selector 1');

  testFalse(
      document.querySelectorAll('pre[foo]'), 'Attribute selector 1, negative');

  testTrue(document.querySelectorAll('pre[id="myid"]'), 'Attribute selector 2');

  testFalse(document.querySelectorAll('pre[id="myid2"]'),
      'Attribute selector 2, negative');

  testTrue(
      document.querySelectorAll('pre[class~="bar"]'), 'Attribute selector 3');

  testFalse(document.querySelectorAll('pre[class~="baz"]'),
      'Attribute selector 3, negative');

  testTrue(
      document.querySelectorAll('pre[lang|="en"]'), 'Attribute selector 4');

  testFalse(document.querySelectorAll('pre[lang|="fr"]'),
      'Attribute selector 4, negative');

  testTrue(document.querySelectorAll('pre.foo'), 'Class selector');

  testFalse(document.querySelectorAll('pre.baz'), 'Class selector, negative');

  testTrue(document.querySelectorAll('pre#myid'), 'Id selector');

  testFalse(document.querySelectorAll('pre#baz'), 'Id selector, negative');
}
