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

/// @assertionElement querySelector(String selectors)
/// Finds the first descendant element of this document that matches 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 e = new Element.html(
      '<div>'
      '<span>'
      '''<hr><pre
                                           id="myid"
                                           class="foo bar"
                                           lang="en">'''
      '</pre>'
      '</span>'
      '</div>',
      treeSanitizer: new NullTreeSanitizer());

  document.body.append(e);

  Expect.isTrue(
      document.querySelector('*') is HtmlElement, 'Universal selector');

  Expect.isTrue(document.querySelector('pre') is PreElement, 'Type selector');

  Expect.isNull(document.querySelector('table'), 'Type selector, negative');

  Expect.isTrue(document.querySelector('span pre') is PreElement,
      'Descendant selector, direct');

  Expect.isTrue(document.querySelector('div pre') is PreElement,
      'Descendant selector, indirect');

  Expect.isTrue(document.querySelector('* pre') is PreElement,
      'Descendant selector, any');

  Expect.isTrue(
      document.querySelector('span > pre') is PreElement, 'Child selector');

  Expect.isNull(
      document.querySelector('div > pre'), 'Child selector, negative');

  Expect.isNull(document.querySelector('pre:first-child'),
      'The :first-child pseudo-class');

  Expect.isTrue(document.querySelector('pre:lang(en)') is PreElement,
      'The :lang() pseudo-class');

  Expect.isNull(
      document.querySelector('pre:lang(fr)'), 'The :lang() pseudo-class');

  Expect.isTrue(
      document.querySelector('hr + pre') is PreElement, 'Adjacent selector');

  Expect.isNull(
      document.querySelector('div + pre'), 'Adjacent selector, negative');

  Expect.isTrue(
      document.querySelector('pre[id]') is PreElement, 'Attribute selector 1');

  Expect.isNull(
      document.querySelector('pre[foo]'), 'Attribute selector 1, negative');

  Expect.isTrue(document.querySelector('pre[id="myid"]') is PreElement,
      'Attribute selector 2');

  Expect.isNull(document.querySelector('pre[id="myid2"]'),
      'Attribute selector 2, negative');

  Expect.isTrue(document.querySelector('pre[class~="bar"]') is PreElement,
      'Attribute selector 3');

  Expect.isNull(document.querySelector('pre[class~="baz"]'),
      'Attribute selector 3, negative');

  Expect.isTrue(document.querySelector('pre[lang|="en"]') is PreElement,
      'Attribute selector 4');

  Expect.isNull(document.querySelector('pre[lang|="fr"]'),
      'Attribute selector 4, negative');

  Expect.isTrue(
      document.querySelector('pre.foo') is PreElement, 'Class selector');

  Expect.isNull(document.querySelector('pre.baz'), 'Class selector, negative');

  Expect.isTrue(
      document.querySelector('pre#myid') is PreElement, 'Id selector');

  Expect.isNull(document.querySelector('pre#baz'), 'Id selector, negative');
}
