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

// @dart = 2.9

/// @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');
}
