summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/domxpath/fn-lang.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/domxpath/fn-lang.html')
-rw-r--r--testing/web-platform/tests/domxpath/fn-lang.html47
1 files changed, 47 insertions, 0 deletions
diff --git a/testing/web-platform/tests/domxpath/fn-lang.html b/testing/web-platform/tests/domxpath/fn-lang.html
new file mode 100644
index 0000000000..c7c102945d
--- /dev/null
+++ b/testing/web-platform/tests/domxpath/fn-lang.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-lang">
+<link rel="help" href="https://www.w3.org/TR/xpath-functions-31/#func-lang">
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+// Set the context node to the first child of the root element, and evaluate
+// the specified XPath expression. The test passes if
+// - The first child element name is 'match' and XPath result is true, or
+// - The first child element name is not 'match' and XPath result is false.
+function testFirstChild(expression, xmlString) {
+ let doc = (new DOMParser()).parseFromString(xmlString, 'text/xml');
+ test(() => {
+ let element = doc.documentElement.firstChild;
+ let result = doc.evaluate(expression, element, null, XPathResult.BOOLEAN_TYPE, null);
+ assert_equals(result.resultType, XPathResult.BOOLEAN_TYPE);
+ assert_equals(result.booleanValue, element.localName == 'match', element.outerHTML);
+ }, `${expression}: ${doc.documentElement.outerHTML}`);
+}
+
+testFirstChild('lang("en")', '<root><match xml:lang="en"/></root>');
+testFirstChild('lang("en")', '<root><match xml:lang="EN"/></root>');
+testFirstChild('lang("en")', '<root><match xml:lang="en-us"/></root>');
+testFirstChild('lang("en")', '<root><unmatch/></root>');
+
+// XPath 1.0 says:
+// if the context node has no xml:lang attribute, by the value of the
+// xml:lang attribute on the nearest ancestor of the context node that has
+// an xml:lang attribute.
+testFirstChild('lang("ja")', '<root xml:lang="ja"><match/></root>');
+
+// XPath 1.0 says:
+// if there is some suffix starting with - such that the attribute value is
+// equal to the argument ignoring that suffix of the attribute value
+testFirstChild('lang("ja")', '<root xml:lang="ja-jp"><unmatch xml:lang="ja_JP"/></root>');
+
+// U+212A should match to ASCII 'k'.
+// XPath 1.0 says:
+// ... such that the attribute value is equal to the argument ignoring that suffix
+// of the attribute value and ignoring case.
+// XPath 3.1 says:
+// ... true if and only if, based on a caseless default match as specified in
+// section 3.13 of The Unicode Standard,
+testFirstChild('lang("ko")', '<root><match xml:lang="&#x212A;o"/></root>');
+</script>
+</body>