#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (c), 2016-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 # """ This module runs tests on XSD meta schema and builtins of the 'xmlschema' package. """ import unittest from xmlschema import XMLSchemaDecodeError, XMLSchemaEncodeError, XMLSchemaValidationError, \ XMLSchema10, XMLSchema11 from xmlschema.validators.builtins import HEX_BINARY_PATTERN, NOT_BASE64_BINARY_PATTERN class TestXsd10BuiltinTypes(unittest.TestCase): @classmethod def setUpClass(cls): cls.types = XMLSchema10.builtin_types() @classmethod def tearDownClass(cls): XMLSchema10.meta_schema.clear() def test_hex_binary_pattern(self): self.assertEqual(HEX_BINARY_PATTERN.search("aff1c").group(0), 'aff1c') self.assertEqual(HEX_BINARY_PATTERN.search("aF3Bc").group(0), 'aF3Bc') def test_not_base64_pattern(self): self.assertIsNone(NOT_BASE64_BINARY_PATTERN.search("YWVpb3U=")) self.assertEqual(NOT_BASE64_BINARY_PATTERN.search("YWVpb3U!=").group(0), '!') def test_boolean_decode(self): boolean_type = self.types['boolean'] self.assertTrue(boolean_type.decode(' true \n') is True) self.assertTrue(boolean_type.decode(' 0 \n') is False) self.assertTrue(boolean_type.decode(' 1 \n') is True) self.assertTrue(boolean_type.decode(' false \n') is False) self.assertRaises(XMLSchemaDecodeError, boolean_type.decode, ' 1.0 ') self.assertRaises(XMLSchemaDecodeError, boolean_type.decode, ' alpha \n') def test_boolean_encode(self): boolean_type = self.types['boolean'] self.assertTrue(boolean_type.encode(True) == 'true') self.assertTrue(boolean_type.encode(False) == 'false') self.assertRaises(XMLSchemaEncodeError, boolean_type.encode, 1) self.assertRaises(XMLSchemaEncodeError, boolean_type.encode, 0) self.assertRaises(XMLSchemaEncodeError, boolean_type.encode, 10) self.assertRaises(XMLSchemaEncodeError, boolean_type.encode, 'alpha') def test_integer_decode(self): integer_type = self.types['integer'] self.assertTrue(integer_type.decode(' 1000 \n') == 1000) self.assertTrue(integer_type.decode(' -19 \n') == -19) self.assertTrue(integer_type.decode(' 0\n') == 0) self.assertRaises(XMLSchemaDecodeError, integer_type.decode, ' 1000.0 \n') self.assertRaises(XMLSchemaDecodeError, integer_type.decode, ' alpha \n') self.assertRaises(XMLSchemaValidationError, self.types['byte'].decode, ' 257 \n') self.assertRaises(XMLSchemaValidationError, self.types['unsignedInt'].decode, ' -1') def test_integer_encode(self): integer_type = self.types['integer'] self.assertTrue(integer_type.encode(1000) == '1000') self.assertTrue(integer_type.encode(-19) == '-19') self.assertTrue(integer_type.encode(0) == '0') self.assertRaises(XMLSchemaEncodeError, integer_type.encode, 10.1) self.assertRaises(XMLSchemaEncodeError, integer_type.encode, 'alpha') self.assertRaises(XMLSchemaValidationError, self.types['unsignedInt'].decode, ' -1') def test_float_decode(self): self.assertTrue(self.types['float'].decode(' 1000.1 \n') == 1000.10) self.assertTrue(self.types['float'].decode(' -19 \n') == -19.0) self.assertTrue(self.types['double'].decode(' 0.0001\n') == 0.0001) self.assertRaises(XMLSchemaDecodeError, self.types['float'].decode, ' true ') self.assertRaises(XMLSchemaDecodeError, self.types['double'].decode, ' alpha \n') def test_float_encode(self): float_type = self.types['float'] self.assertTrue(float_type.encode(1000.0) == '1000.0') self.assertTrue(float_type.encode(-19.0) == '-19.0') self.assertTrue(float_type.encode(0.0) == '0.0') self.assertRaises(XMLSchemaEncodeError, float_type.encode, True) self.assertRaises(XMLSchemaEncodeError, float_type.encode, 'alpha') def test_time_type(self): time_type = self.types['time'] self.assertTrue(time_type.is_valid('14:35:00')) self.assertTrue(time_type.is_valid('14:35:20.5345')) self.assertTrue(time_type.is_valid('14:35:00-01:00')) self.assertTrue(time_type.is_valid('14:35:00Z')) self.assertTrue(time_type.is_valid('00:00:00')) self.assertTrue(time_type.is_valid('24:00:00')) self.assertFalse(time_type.is_valid('4:20:00')) self.assertFalse(time_type.is_valid('14:35:0')) self.assertFalse(time_type.is_valid('14:35')) self.assertFalse(time_type.is_valid('14:35.5:00')) def test_datetime_type(self): datetime_type = self.types['dateTime'] self.assertTrue(datetime_type.is_valid('2007-05-10T14:35:00')) self.assertTrue(datetime_type.is_valid('2007-05-10T14:35:20.6')) self.assertTrue(datetime_type.is_valid('2007-05-10T14:35:00-03:00')) self.assertTrue(datetime_type.is_valid('2007-05-10T14:35:00Z')) self.assertFalse(datetime_type.is_valid('2007-05-10T14:35')) self.assertFalse(datetime_type.is_valid('2007-05-10t14:35:00')) self.assertFalse(datetime_type.is_valid('2007-05-1014:35:00')) self.assertFalse(datetime_type.is_valid('07-05-10T14:35:00')) self.assertTrue(datetime_type.is_valid('2007-05-10')) # Issue #85 self.assertTrue(datetime_type.is_valid('2018-10-10T13:57:53.0702116-04:00')) def test_date_type(self): date_type = self.types['date'] self.assertTrue(date_type.is_valid('2012-05-31')) self.assertTrue(date_type.is_valid('-0065-10-15')) self.assertTrue(date_type.is_valid('12012-05-31')) self.assertTrue(date_type.is_valid('2012-05-31-05:00')) self.assertTrue(date_type.is_valid('2015-06-30Z')) self.assertFalse(date_type.is_valid('12-05-31')) self.assertFalse(date_type.is_valid('2012-5-31')) self.assertFalse(date_type.is_valid('31-05-2012')) self.assertFalse(date_type.is_valid('1999-06-31')) self.assertFalse(date_type.is_valid('+2012-05-31')) self.assertFalse(date_type.is_valid('')) def test_year_zero(self): self.assertFalse(self.types['date'].is_valid('0000-01-01')) def test_g_year_type(self): g_year_type = self.types['gYear'] self.assertTrue(g_year_type.is_valid('2007')) self.assertTrue(g_year_type.is_valid('2013-01:00')) self.assertTrue(g_year_type.is_valid('102013-01:00')) self.assertTrue(g_year_type.is_valid('0821')) self.assertTrue(g_year_type.is_valid('0014')) self.assertTrue(g_year_type.is_valid('-0044')) self.assertTrue(g_year_type.is_valid('13999')) self.assertFalse(g_year_type.is_valid('045')) self.assertFalse(g_year_type.is_valid('800')) self.assertFalse(g_year_type.is_valid('')) def test_g_year_month_type(self): g_year_month_type = self.types['gYearMonth'] self.assertTrue(g_year_month_type.is_valid('2010-07')) self.assertTrue(g_year_month_type.is_valid('2020-01-05:00')) self.assertFalse(g_year_month_type.is_valid('99-02')) self.assertFalse(g_year_month_type.is_valid('1999')) self.assertFalse(g_year_month_type.is_valid('1995-3')) self.assertFalse(g_year_month_type.is_valid('1860-14')) self.assertFalse(g_year_month_type.is_valid('')) def test_g_month_type(self): g_month_type = self.types['gMonth'] self.assertTrue(g_month_type.is_valid('--08')) self.assertTrue(g_month_type.is_valid('--05-03:00')) self.assertFalse(g_month_type.is_valid('03')) self.assertFalse(g_month_type.is_valid('3')) self.assertFalse(g_month_type.is_valid('--13')) self.assertFalse(g_month_type.is_valid('--3')) self.assertFalse(g_month_type.is_valid('')) def test_g_month_day_type(self): g_month_day_type = self.types['gMonthDay'] self.assertTrue(g_month_day_type.is_valid('--12-24')) self.assertTrue(g_month_day_type.is_valid('--04-25Z')) self.assertFalse(g_month_day_type.is_valid('12-24')) self.assertFalse(g_month_day_type.is_valid('--11-31')) self.assertFalse(g_month_day_type.is_valid('--2-11')) self.assertFalse(g_month_day_type.is_valid('--02-1')) self.assertFalse(g_month_day_type.is_valid('')) def test_g_day_type(self): g_day_type = self.types['gDay'] self.assertTrue(g_day_type.is_valid('---19')) self.assertTrue(g_day_type.is_valid('---07')) self.assertFalse(g_day_type.is_valid('---32')) self.assertFalse(g_day_type.is_valid('07')) self.assertFalse(g_day_type.is_valid('--07')) self.assertFalse(g_day_type.is_valid('---7')) self.assertFalse(g_day_type.is_valid('')) def test_duration_type(self): duration_type = self.types['duration'] self.assertTrue(duration_type.is_valid('-P809YT3H5M5S')) self.assertTrue(duration_type.is_valid('P5Y7M20DT3H5M5S')) self.assertTrue(duration_type.is_valid('P1DT6H')) self.assertTrue(duration_type.is_valid('P15M')) self.assertTrue(duration_type.is_valid('PT30M')) self.assertTrue(duration_type.is_valid('P0Y15M0D')) self.assertTrue(duration_type.is_valid('P0Y')) self.assertTrue(duration_type.is_valid('-P10D')) self.assertTrue(duration_type.is_valid('PT5M30.5S')) self.assertTrue(duration_type.is_valid('PT10.5S')) self.assertFalse(duration_type.is_valid('P-50M')) self.assertFalse(duration_type.is_valid('P50MT')) self.assertFalse(duration_type.is_valid('P1YM7D')) self.assertFalse(duration_type.is_valid('P10.8Y')) self.assertFalse(duration_type.is_valid('P3D5H')) self.assertFalse(duration_type.is_valid('1Y')) self.assertFalse(duration_type.is_valid('P3D4M')) self.assertFalse(duration_type.is_valid('P')) self.assertFalse(duration_type.is_valid('PT10.S')) self.assertFalse(duration_type.is_valid('')) class TestXsd11BuiltinTypes(TestXsd10BuiltinTypes): @classmethod def setUpClass(cls): cls.types = XMLSchema11.builtin_types() @classmethod def tearDownClass(cls): XMLSchema11.meta_schema.clear() def test_year_zero(self): self.assertTrue(self.types['date'].is_valid('0000-01-01')) def test_date_time_stamp(self): date_time_stamp_type = self.types['dateTimeStamp'] self.assertTrue(date_time_stamp_type.is_valid('2003-10-20T16:50:08-03:00')) self.assertTrue(date_time_stamp_type.is_valid('2003-10-20T16:50:08Z')) self.assertFalse(date_time_stamp_type.is_valid('2003-10-20T16:50:08')) self.assertFalse(date_time_stamp_type.is_valid('1980-02-28T17:09:20.1')) self.assertFalse(date_time_stamp_type.is_valid('')) def test_day_time_duration_type(self): day_time_duration_type = self.types['dayTimeDuration'] self.assertTrue(day_time_duration_type.is_valid('P7DT15H40M0S')) self.assertTrue(day_time_duration_type.is_valid('-P10D')) self.assertTrue(day_time_duration_type.is_valid('P0D')) self.assertTrue(day_time_duration_type.is_valid('PT13M')) self.assertTrue(day_time_duration_type.is_valid('P0DT17M')) self.assertTrue(day_time_duration_type.is_valid('PT3H20M10.5S')) self.assertFalse(day_time_duration_type.is_valid('PT5D')) self.assertFalse(day_time_duration_type.is_valid('PT3HM10S')) self.assertFalse(day_time_duration_type.is_valid('P7DT')) self.assertFalse(day_time_duration_type.is_valid('PT3H1.4M')) self.assertFalse(day_time_duration_type.is_valid('P-5D')) self.assertFalse(day_time_duration_type.is_valid('P1D5H')) self.assertFalse(day_time_duration_type.is_valid('PT10M21.S')) self.assertFalse(day_time_duration_type.is_valid('P')) self.assertFalse(day_time_duration_type.is_valid('')) def test_year_month_duration_type(self): year_month_duration_type = self.types['yearMonthDuration'] self.assertTrue(year_month_duration_type.is_valid('P3Y4M')) self.assertTrue(year_month_duration_type.is_valid('P15M')) self.assertTrue(year_month_duration_type.is_valid('P0Y')) self.assertTrue(year_month_duration_type.is_valid('P0Y23M')) self.assertTrue(year_month_duration_type.is_valid('-P8Y')) self.assertFalse(year_month_duration_type.is_valid('3Y4M')) self.assertFalse(year_month_duration_type.is_valid('P6M1Y')) self.assertFalse(year_month_duration_type.is_valid('P')) self.assertFalse(year_month_duration_type.is_valid('P1Y6M15D')) self.assertFalse(year_month_duration_type.is_valid('P1.2Y')) self.assertFalse(year_month_duration_type.is_valid('P2YM')) self.assertFalse(year_month_duration_type.is_valid('P-1Y')) self.assertFalse(year_month_duration_type.is_valid('')) class TestGlobalMaps(unittest.TestCase): @classmethod def setUpClass(cls): XMLSchema10.meta_schema.build() XMLSchema11.meta_schema.build() @classmethod def tearDownClass(cls): XMLSchema10.meta_schema.clear() XMLSchema11.meta_schema.clear() def test_xsd_10_globals(self): self.assertEqual(len(XMLSchema10.meta_schema.maps.notations), 2) self.assertEqual(len(XMLSchema10.meta_schema.maps.types), 92) self.assertEqual(len(XMLSchema10.meta_schema.maps.attributes), 8) self.assertEqual(len(XMLSchema10.meta_schema.maps.attribute_groups), 3) self.assertEqual(len(XMLSchema10.meta_schema.maps.groups), 12) self.assertEqual(len(XMLSchema10.meta_schema.maps.elements), 41) self.assertEqual(len([e.is_global() for e in XMLSchema10.meta_schema.maps.iter_globals()]), 158) self.assertEqual(len(XMLSchema10.meta_schema.maps.substitution_groups), 0) def test_xsd_11_globals(self): self.assertEqual(len(XMLSchema11.meta_schema.maps.notations), 2) self.assertEqual(len(XMLSchema11.meta_schema.maps.types), 103) self.assertEqual(len(XMLSchema11.meta_schema.maps.attributes), 14) self.assertEqual(len(XMLSchema11.meta_schema.maps.attribute_groups), 4) self.assertEqual(len(XMLSchema11.meta_schema.maps.groups), 13) self.assertEqual(len(XMLSchema11.meta_schema.maps.elements), 47) self.assertEqual(len([e.is_global() for e in XMLSchema11.meta_schema.maps.iter_globals()]), 183) self.assertEqual(len(XMLSchema11.meta_schema.maps.substitution_groups), 1) def test_xsd_10_build(self): self.assertEqual(len([e for e in XMLSchema10.meta_schema.maps.iter_globals()]), 158) self.assertTrue(XMLSchema10.meta_schema.maps.built) XMLSchema10.meta_schema.maps.clear() XMLSchema10.meta_schema.maps.build() self.assertTrue(XMLSchema10.meta_schema.maps.built) def test_xsd_11_build(self): self.assertEqual(len([e for e in XMLSchema11.meta_schema.maps.iter_globals()]), 183) self.assertTrue(XMLSchema11.meta_schema.maps.built) XMLSchema11.meta_schema.maps.clear() XMLSchema11.meta_schema.maps.build() self.assertTrue(XMLSchema11.meta_schema.maps.built) def test_xsd_10_components(self): total_counter = 0 global_counter = 0 for g in XMLSchema10.meta_schema.maps.iter_globals(): for c in g.iter_components(): total_counter += 1 if c.is_global(): global_counter += 1 self.assertEqual(global_counter, 158) self.assertEqual(total_counter, 782) def test_xsd_11_components(self): total_counter = 0 global_counter = 0 for g in XMLSchema11.meta_schema.maps.iter_globals(): for c in g.iter_components(): total_counter += 1 if c.is_global(): global_counter += 1 self.assertEqual(global_counter, 183) self.assertEqual(total_counter, 932) def test_xsd_11_restrictions(self): all_model_type = XMLSchema11.meta_schema.types['all'] self.assertTrue( all_model_type.content_type.is_restriction(all_model_type.base_type.content_type) ) if __name__ == '__main__': from xmlschema.tests import print_test_header print_test_header() unittest.main()