/*
 * 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 <a href="http://bugs.webkit.org/show_bug.cgi?id=50366">bug 50366</a>:
 * XPath lexer misinterprets expression starting with "div"
 * @description Test that an NCName and * are interpreted as an operator when in
 * binary operator context, and as a NameTest otherwise.
 */
import "dart:html";
import "../../testharness.dart" as hrns;
import "xpath-test-pre.dart";

const String htmlEL = r'''
<div id="context">
  <div id="two" div="x">2</div>
</div>
''';

void main() {
    document.body.appendHtml(htmlEL, treeSanitizer: new hrns.NullTreeSanitizer());
    var context = document.getElementById('context');
    var div = document.getElementById('two');

    // =========== div ===========

    test(document, context, "div", [div], null);  // div with no preceding token
    test(document, context, "  div", [div], null);
    // div following every possible [28] ExprToken http://www.w3.org/TR/xpath/
    test(document, context, "(div) div (div)", 2/2, null);  // div after ( and )
    test(document, context, "self::node()[div] div 1", 2/1, null);  // div after [ and ]
    test(document, context, ". div .", 2/2, null);  // div after .
    test(document, div, ".. div ..", 2/2, null);  // div after ..
    test(document, context, "string(div/@div)", "x", null);  // div after @
    test(document, context, "substring-before('1992', div)", "199", null);  // div after ,
    test(document, div, "self::div", [div], null);  // div after ::
    test(document, context, "* div 4", 2/4, null);  // div after NameTest *
    test(document, context, "'3' div 4", 3/4, null);  // div after Literal
    test(document, context, "\"3\" div 4", 3/4, null);  // div after Literal
    test(document, context, "12 div 4", 12/4, null);  // div after Number

    // div following every [32] Operator
    test(document, context, "true() and div", true, null);  // div after OperatorName and
    test(document, context, "false() or div", true, null);  // div after OperatorName or
    test(document, context, "div mod div", 0, null);  // div after OperatorName mod
    test(document, context, "div div div", 1, null);  // div after OperatorName div
    test(document, context, "3 * div", 6, null);  // div after MultiplyOperator
    test(document, context, "div/div", [], null);  // div after /
    test(document, context, "div//div", [], null);  // div after //
    test(document, context, "zz|div", [div], null);  // div after |
    test(document, context, "div+div", 4, null);  // div after +
    test(document, context, "- - div", 2, null);  // div after unary -
    test(document, context, "5 -div", 3, null);  // div after binary -
    test(document, context, "div=div", true, null);  // div after =
    test(document, context, "div!=div", false, null);  // div after =
    test(document, context, "div<div", false, null);  // div after <
    test(document, context, "div<=div", true, null);  // div after <=
    test(document, context, "div>div", false, null);  // div after >
    test(document, context, "div>=div", true, null);  // div after >=


    // =========== * ===========

    test(document, context, "*", [div], null);  // * with no preceding token
    test(document, context, "  *", [div], null);
    // * following every possible [28] ExprToken http://www.w3.org/TR/xpath/
    test(document, context, "(*) * (*)", 2*2, null);  // * after ( and )
    test(document, context, "self::node()[*] * 1", 2*1, null);  // * after [ and ]
    test(document, context, ". * .", 2*2, null);  // * after .
    test(document, div, ".. * ..", 2*2, null);  // * after ..
    // (* can't follow @)
    test(document, context, "substring-before('1992', *)", "199", null);  // * after ,
    test(document, div, "self::*", [div], null);  // * after ::
    test(document, context, "* * 4", 2*4, null);  // * after NameTest *
    test(document, context, "'3' * 4", 3*4, null);  // * after Literal
    test(document, context, "\"3\" * 4", 3*4, null);  // * after Literal
    test(document, context, "12 * 4", 12*4, null);  // * after Number

    // * following every [32] Operator
    test(document, context, "true() and *", true, null);  // * after OperatorName and
    test(document, context, "false() or *", true, null);  // * after OperatorName or
    test(document, context, "* mod *", 0, null);  // * after OperatorName mod
    test(document, context, "* div *", 1, null);  // * after OperatorName div
    test(document, context, "3 * *", 6, null);  // * after MultiplyOperator
    test(document, context, "*/*", [], null);  // * after /
    test(document, context, "*//*", [], null);  // * after //
    test(document, context, "zz|*", [div], null);  // * after |
    test(document, context, "*+*", 4, null);  // * after +
    test(document, context, "- - *", 2, null);  // * after unary -
    test(document, context, "5 -*", 3, null);  // * after binary -
    test(document, context, "*=*", true, null);  // * after =
    test(document, context, "*!=*", false, null);  // * after =
    test(document, context, "*<*", false, null);  // * after <
    test(document, context, "*<=*", true, null);  // * after <=
    test(document, context, "*>*", false, null);  // * after >
    test(document, context, "*>=*", true, null);  // * after >=

    var xmlDoc = (new DomParser()).parseFromString("<or xmlns='uri'>5</or>", "text/xml");
    var nsResolver = (prefix) {return 'uri';};
    // div and * after :
    test(xmlDoc, xmlDoc, "or:or", [xmlDoc.documentElement], nsResolver);
    test(xmlDoc, xmlDoc, "or:*", [xmlDoc.documentElement], nsResolver);

    // A few tests with mod as well
    var xmlDoc2 = (new DomParser()).parseFromString("<mod and='x'>8</mod>", "text/xml");
    test(xmlDoc2, xmlDoc2, "mod", [xmlDoc2.documentElement], null);
    test(xmlDoc2, xmlDoc2, "mod mod mod", 0, null);
    test(xmlDoc2, xmlDoc2, "(mod) mod 5", 3, null);
    test(xmlDoc2, xmlDoc2, "string(mod/@and)", 'x', null);

    checkTestFailures();
}