debian-elementpath/tests/test_xpath_token.py

119 lines
4.6 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (c), 2018-2019, SISSA (International School for Advanced Studies).
# All rights reserved.
# This file is distributed under the terms of the MIT License.
# See the file 'LICENSE' in the root directory of the present
# distribution, or http://opensource.org/licenses/MIT.
#
# @author Davide Brunato <brunato@sissa.it>
#
from __future__ import unicode_literals
import unittest
import io
import math
import xml.etree.ElementTree as ElementTree
from elementpath.namespaces import XSD_NAMESPACE
from elementpath.xpath_nodes import AttributeNode, TypedAttribute, TypedElement, NamespaceNode
from elementpath.xpath_token import ordinal
from elementpath.xpath_context import XPathContext
from elementpath.xpath1_parser import XPath1Parser
class XPathTokenTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.parser = XPath1Parser(namespaces={'xs': XSD_NAMESPACE, 'tst': "http://xpath.test/ns"})
def test_ordinal_function(self):
self.assertEqual(ordinal(1), '1st')
self.assertEqual(ordinal(2), '2nd')
self.assertEqual(ordinal(3), '3rd')
self.assertEqual(ordinal(4), '4th')
self.assertEqual(ordinal(11), '11th')
self.assertEqual(ordinal(23), '23rd')
self.assertEqual(ordinal(34), '34th')
def test_get_argument_method(self):
token = self.parser.symbol_table['true'](self.parser)
self.assertIsNone(token.get_argument(2))
with self.assertRaises(TypeError):
token.get_argument(1, required=True)
def test_select_results(self):
token = self.parser.parse('.')
elem = ElementTree.Element('A', attrib={'max': '30'})
elem.text = '10'
context = XPathContext(elem)
self.assertListEqual(list(token.select_results(context)), [elem])
context = XPathContext(elem, item=TypedElement(elem, 10))
self.assertListEqual(list(token.select_results(context)), [elem])
context = XPathContext(elem, item=AttributeNode('max', '30'))
self.assertListEqual(list(token.select_results(context)), ['30'])
context = XPathContext(elem, item=TypedAttribute(AttributeNode('max', '30'), 30))
self.assertListEqual(list(token.select_results(context)), [30])
context = XPathContext(elem, item=10)
self.assertListEqual(list(token.select_results(context)), [10])
context = XPathContext(elem, item='10')
self.assertListEqual(list(token.select_results(context)), ['10'])
def test_boolean_value_function(self):
token = self.parser.parse('true()')
elem = ElementTree.Element('A')
with self.assertRaises(TypeError):
token.boolean_value(elem)
self.assertFalse(token.boolean_value([]))
self.assertTrue(token.boolean_value([elem]))
self.assertFalse(token.boolean_value([0]))
self.assertTrue(token.boolean_value([1]))
with self.assertRaises(TypeError):
token.boolean_value([1, 1])
with self.assertRaises(TypeError):
token.boolean_value(elem)
self.assertFalse(token.boolean_value(0))
self.assertTrue(token.boolean_value(1))
def test_data_value_function(self):
token = self.parser.parse('true()')
self.assertIsNone(token.data_value(None))
def test_string_value_function(self):
token = self.parser.parse('true()')
document = ElementTree.parse(io.StringIO(u'<A>123<B1>456</B1><B2>789</B2></A>'))
element = ElementTree.Element('schema')
attribute = AttributeNode('id', '0212349350')
namespace = NamespaceNode('xs', 'http://www.w3.org/2001/XMLSchema')
comment = ElementTree.Comment('nothing important')
pi = ElementTree.ProcessingInstruction('action', 'nothing to do')
text = u'betelgeuse'
self.assertEqual(token.string_value(document), '123456789')
self.assertEqual(token.string_value(element), '')
self.assertEqual(token.string_value(attribute), '0212349350')
self.assertEqual(token.string_value(namespace), 'http://www.w3.org/2001/XMLSchema')
self.assertEqual(token.string_value(comment), 'nothing important')
self.assertEqual(token.string_value(pi), 'action nothing to do')
self.assertEqual(token.string_value(text), 'betelgeuse')
self.assertEqual(token.string_value(None), '')
self.assertEqual(token.string_value(10), '10')
def test_number_value_function(self):
token = self.parser.parse('true()')
self.assertEqual(token.number_value("19"), 19)
self.assertTrue(math.isnan(token.number_value("not a number")))
if __name__ == '__main__':
unittest.main()