def test_hashing(self): if sys.version_info < (3, 8): self.assertEqual(hash(Timezone.fromstring('+05:00')), 1289844826723787395) else: self.assertEqual(hash(Timezone.fromstring('+05:00')), 7009945331308913293)
def test_datetimestamp_constructor(self): tz0 = Timezone(datetime.timedelta(hours=7, minutes=0)) tz1 = Timezone(datetime.timedelta(hours=5, minutes=24)) ts = DateTimeStamp(1969, 7, 20, 20, 18, tzinfo=tz0) self.assertEqual(self.parser.xsd_version, '1.0') self.wrong_syntax('xs:dateTimeStamp("1969-07-20T20:18:00+07:00")') self.parser._xsd_version = '1.1' try: self.check_value('xs:dateTimeStamp(())', []) self.check_value('xs:dateTimeStamp("1969-07-20T20:18:00+07:00")', ts) self.check_value('xs:dateTimeStamp(xs:untypedAtomic("1969-07-20T20:18:00+07:00"))', ts) self.check_value('xs:dateTimeStamp("1969-07-20T20:18:00+07:00") ' 'castable as xs:dateTimeStamp', True) self.check_value('xs:untypedAtomic("1969-07-20T20:18:00+07:00") ' 'castable as xs:dateTimeStamp', True) self.check_value('xs:dateTime("1969-07-20T20:18:00+07:00") ' 'cast as xs:dateTimeStamp', ts) self.check_value('xs:dateTimeStamp("2000-05-10T21:30:00+05:24")', datetime.datetime(2000, 5, 10, hour=21, minute=30, tzinfo=tz1)) self.wrong_value('xs:dateTimeStamp("1999-12-31T24:00:00")') self.wrong_value('xs:dateTimeStamp("2000-05-10t21:30:00+05:24")') self.wrong_type('xs:dateTimeStamp("1969-07-20T20:18:00", "+07:00")', 'XPST0017') self.wrong_type('xs:dateTimeStamp("1969-07-20T20:18:00+07:00"', 'XPST0017') finally: self.parser._xsd_version = '1.0'
def test_init_timedelta(self): td0 = datetime.timedelta(0) td1 = datetime.timedelta(hours=5, minutes=15) td2 = datetime.timedelta(hours=-14, minutes=0) td3 = datetime.timedelta(hours=-14, minutes=-1) self.assertEqual(Timezone(td0).offset, td0) self.assertEqual(Timezone(td1).offset, td1) self.assertEqual(Timezone(td2).offset, td2) self.assertRaises(ValueError, Timezone, td3) self.assertRaises(TypeError, Timezone, 0)
def test_gregorian_month_day_constructor(self): tz = Timezone(datetime.timedelta(hours=-14, minutes=0)) self.check_value('xs:gMonthDay("--07-02")', datetime.datetime(2000, 7, 2)) self.check_value('xs:gMonthDay(xs:untypedAtomic("--07-02"))', datetime.datetime(2000, 7, 2)) self.check_value('xs:gMonthDay("--07-02-14:00")', datetime.datetime(2000, 7, 2, tzinfo=tz)) self.check_value('xs:gMonthDay(xs:dateTime("1969-07-20T20:18:00"))', GregorianMonthDay(7, 20)) self.wrong_value('xs:gMonthDay("--7-02")') self.wrong_value('xs:gMonthDay("-07-02")') self.wrong_value('xs:gMonthDay("--07-32")') root = self.etree.XML('<root a="--05-20"/>') context = XPathContext(root) self.check_value('xs:gMonthDay(@a)', GregorianMonthDay(5, 20), context=context) context.item = GregorianMonthDay(1, 15) self.check_value('xs:gMonthDay(.)', GregorianMonthDay(1, 15), context=context)
def test_eq_operator(self): tz = Timezone.fromstring('-05:00') mkdt = DateTime.fromstring self.assertTrue(mkdt("2002-04-02T12:00:00-01:00") == mkdt("2002-04-02T17:00:00+04:00")) self.assertFalse(mkdt("2002-04-02T12:00:00") == mkdt("2002-04-02T23:00:00+06:00")) self.assertFalse(mkdt("2002-04-02T12:00:00") == mkdt("2002-04-02T17:00:00")) self.assertTrue(mkdt("2002-04-02T12:00:00") == mkdt("2002-04-02T12:00:00")) self.assertTrue(mkdt("2002-04-02T23:00:00-04:00") == mkdt("2002-04-03T02:00:00-01:00")) self.assertTrue(mkdt("1999-12-31T24:00:00") == mkdt("1999-12-31T00:00:00")) self.assertTrue(mkdt("2005-04-04T24:00:00") == mkdt("2005-04-04T00:00:00")) self.assertTrue(mkdt("2002-04-02T12:00:00-01:00", tz) == mkdt("2002-04-02T17:00:00+04:00", tz)) self.assertTrue(mkdt("2002-04-02T12:00:00", tz) == mkdt("2002-04-02T23:00:00+06:00", tz)) self.assertFalse(mkdt("2002-04-02T12:00:00", tz) == mkdt("2002-04-02T17:00:00", tz)) self.assertTrue(mkdt("2002-04-02T12:00:00", tz) == mkdt("2002-04-02T12:00:00", tz)) self.assertTrue(mkdt("2002-04-02T23:00:00-04:00", tz) == mkdt("2002-04-03T02:00:00-01:00", tz)) self.assertTrue(mkdt("1999-12-31T24:00:00", tz) == mkdt("1999-12-31T00:00:00", tz)) self.assertTrue(mkdt("2005-04-04T24:00:00", tz) == mkdt("2005-04-04T00:00:00", tz)) self.assertFalse(mkdt("2005-04-04T24:00:00", tz) != mkdt("2005-04-04T00:00:00", tz)) self.assertTrue(DateTime.fromstring("-1000-01-01") == DateTime.fromstring("-1000-01-01")) self.assertTrue(DateTime.fromstring("-10000-01-01") == DateTime.fromstring("-10000-01-01")) self.assertFalse(DateTime.fromstring("20000-01-01") != DateTime.fromstring("20000-01-01")) self.assertFalse(DateTime.fromstring("-10000-01-02") == DateTime.fromstring("-10000-01-01"))
def test_datetime_constructor(self): tz1 = Timezone(datetime.timedelta(hours=5, minutes=24)) self.check_value('xs:dateTime(())', []) self.check_value('xs:dateTime("1969-07-20T20:18:00")', DateTime10(1969, 7, 20, 20, 18)) self.check_value( 'xs:dateTime(xs:untypedAtomic("1969-07-20T20:18:00"))', DateTime10(1969, 7, 20, 20, 18)) self.check_value( 'xs:dateTime("2000-05-10T21:30:00+05:24")', datetime.datetime(2000, 5, 10, hour=21, minute=30, tzinfo=tz1)) self.check_value('xs:dateTime("1999-12-31T24:00:00")', datetime.datetime(2000, 1, 1, 0, 0)) self.check_value('xs:dateTime(xs:date("1969-07-20"))', DateTime10(1969, 7, 20)) self.check_value('xs:dateTime(xs:date("1969-07-20"))', DateTime10) with self.assertRaises(AssertionError): self.check_value('xs:dateTime(xs:date("1969-07-20"))', DateTime) self.parser._xsd_version = '1.1' try: self.check_value('xs:dateTime(xs:date("1969-07-20"))', DateTime(1969, 7, 20)) self.check_value('xs:dateTime(xs:date("1969-07-20"))', DateTime) finally: self.parser._xsd_version = '1.0' self.wrong_value('xs:dateTime("2000-05-10t21:30:00+05:24")') self.wrong_value('xs:dateTime("2000-5-10T21:30:00+05:24")') self.wrong_value('xs:dateTime("2000-05-10T21:3:00+05:24")') self.wrong_value('xs:dateTime("2000-05-10T21:13:0+05:24")') self.wrong_value('xs:dateTime("2000-05-10T21:13:0")') self.check_value('xs:dateTime("-25252734927766554-12-31T12:00:00")', OverflowError) self.wrong_type('xs:dateTime(50)', 'FORG0006', '1st argument has an invalid type') self.wrong_type('xs:dateTime("2000-05-10T21:30:00", "+05:24")', 'XPST0017') root = self.etree.XML('<root a="1969-07-20T20:18:00"/>') context = XPathContext(root) self.check_value('xs:dateTime(@a)', DateTime10(1969, 7, 20, 20, 18), context=context) context.item = AttributeNode('a', str(DateTime10(1969, 7, 20, 20, 18))) self.check_value('xs:dateTime(.)', DateTime10(1969, 7, 20, 20, 18), context=context) context.item = AttributeNode('a', 'true') self.check_value('xs:dateTime(.)', ValueError, context=context) context.item = DateTime10(1969, 7, 20, 20, 18) self.check_value('xs:dateTime(.)', DateTime10(1969, 7, 20, 20, 18), context=context)
def test_date_constructor(self): tz = Timezone(datetime.timedelta(hours=-14, minutes=0)) self.check_value('xs:date("2017-01-19")', datetime.datetime(2017, 1, 19)) self.check_value('xs:date(xs:untypedAtomic("2017-01-19"))', datetime.datetime(2017, 1, 19)) self.check_value('xs:date("2011-11-11-14:00")', datetime.datetime(2011, 11, 11, tzinfo=tz)) self.check_value('xs:date(xs:dateTime("1969-07-20T20:18:00"))', Date10(1969, 7, 20)) self.wrong_value('xs:date("2011-11-11-14:01")') self.wrong_value('xs:date("11-11-11")') self.check_value('xs:date(())', []) root = self.etree.XML('<root a="2017-01-19"/>') context = XPathContext(root) self.check_value('xs:date(@a)', Date10(2017, 1, 19), context=context) class DummyXsdDateType(xpath_test_class.DummyXsdType): def is_simple(self): return True def decode(self, obj, *args, **kwargs): return Date10.fromstring(obj) def validate(self, obj, *args, **kwargs): if not isinstance(obj, Date10): raise TypeError() context.item = AttributeNode('a', 'true', xsd_type=DummyXsdDateType()) self.check_value('xs:date(.)', TypeError, context=context) context.item = AttributeNode('a', str(Date10(2017, 1, 19))) self.check_value('xs:date(.)', Date10(2017, 1, 19), context=context) context.item = AttributeNode('a', 'true') self.check_value('xs:date(.)', ValueError, context=context) root = self.etree.XML("<root>2017-10-02</root>") context = XPathContext(root) self.check_value('xs:date(.)', Date10(2017, 10, 2), context=context) root = self.etree.XML("<root>2017<a>-10-02</a></root>") context = XPathContext(root) self.check_value('xs:date(.)', Date10(2017, 10, 2), context=context) context = XPathContext(root, item=Date10(2017, 10, 2)) self.check_value('xs:date(.)', Date10(2017, 10, 2), context=context)
def test_time_constructor(self): tz = Timezone(datetime.timedelta(hours=5, minutes=24)) self.check_value('xs:time("21:30:00")', datetime.datetime(2000, 1, 1, 21, 30)) self.check_value('xs:time(xs:untypedAtomic("21:30:00"))', datetime.datetime(2000, 1, 1, 21, 30)) self.check_value('xs:time("11:15:48+05:24")', datetime.datetime(2000, 1, 1, 11, 15, 48, tzinfo=tz)) self.check_value('xs:time(xs:dateTime("1969-07-20T20:18:00"))', Time(20, 18, 00)) self.wrong_value('xs:time("24:00:01")') root = self.etree.XML('<root a="13:15:39"/>') context = XPathContext(root) self.check_value('xs:time(@a)', Time(13, 15, 39), context=context) context.item = Time(20, 10, 00) self.check_value('xs:time(.)', Time(20, 10, 00), context=context)
def test_date_constructor(self): tz = Timezone(datetime.timedelta(hours=-14, minutes=0)) self.check_value('xs:date("2017-01-19")', datetime.datetime(2017, 1, 19)) self.check_value('xs:date(xs:untypedAtomic("2017-01-19"))', datetime.datetime(2017, 1, 19)) self.check_value('xs:date("2011-11-11-14:00")', datetime.datetime(2011, 11, 11, tzinfo=tz)) self.check_value('xs:date(xs:dateTime("1969-07-20T20:18:00"))', Date10(1969, 7, 20)) self.wrong_value('xs:date("2011-11-11-14:01")') self.wrong_value('xs:date("11-11-11")') self.check_value('xs:date(())', []) root = self.etree.XML('<root a="2017-01-19"/>') context = XPathContext(root) self.check_value('xs:date(@a)', Date10(2017, 1, 19), context=context) context.item = AttributeNode('a', str(Date10(2017, 1, 19))) self.check_value('xs:date(.)', Date10(2017, 1, 19), context=context) context.item = AttributeNode('a', 'true') self.check_value('xs:date(.)', ValueError, context=context) context.item = AttributeNode('a', True) self.check_value('xs:date(.)', ValueError, context=context) with patch.multiple(self.dummy_type, is_simple=lambda x: True): context.item = TypedAttribute(AttributeNode('a', 'true'), self.dummy_type, True) self.check_value('xs:date(.)', TypeError, context=context) root = self.etree.XML("<root>2017-10-02</root>") context = XPathContext(root) self.check_value('xs:date(.)', Date10(2017, 10, 2), context=context) root = self.etree.XML("<root>2017<a>-10-02</a></root>") context = XPathContext(root) self.check_value('xs:date(.)', Date10(2017, 10, 2), context=context) context = XPathContext(root, item=Date10(2017, 10, 2)) self.check_value('xs:date(.)', Date10(2017, 10, 2), context=context)
def test_gregorian_day_constructor(self): tz = Timezone(datetime.timedelta(hours=5, minutes=24)) self.check_value('xs:gDay("---30")', datetime.datetime(2000, 1, 30)) self.check_value('xs:gDay(xs:untypedAtomic("---30"))', datetime.datetime(2000, 1, 30)) self.check_value('xs:gDay("---21+05:24")', datetime.datetime(2000, 1, 21, tzinfo=tz)) self.check_value('xs:gDay(xs:dateTime("1969-07-20T20:18:00"))', GregorianDay(20)) self.wrong_value('xs:gDay("---32")') self.wrong_value('xs:gDay("--19")') root = self.etree.XML('<root a="---08"/>') context = XPathContext(root) self.check_value('xs:gDay(@a)', GregorianDay(8), context=context) context.item = GregorianDay(10) self.check_value('xs:gDay(.)', GregorianDay(10), context=context)
def test_as_string(self): self.assertEqual(str(Timezone.fromstring('+05:00')), '+05:00') self.assertEqual(str(Timezone.fromstring('-13:15')), '-13:15')
def test_init_format(self): self.assertEqual(Timezone.fromstring('Z').offset, datetime.timedelta(0)) self.assertEqual(Timezone.fromstring('00:00').offset, datetime.timedelta(0)) self.assertEqual(Timezone.fromstring('+00:00').offset, datetime.timedelta(0)) self.assertEqual(Timezone.fromstring('-00:00').offset, datetime.timedelta(0)) self.assertEqual(Timezone.fromstring('-0:0').offset, datetime.timedelta(0)) self.assertEqual(Timezone.fromstring('+05:15').offset, datetime.timedelta(hours=5, minutes=15)) self.assertEqual(Timezone.fromstring('-11:00').offset, datetime.timedelta(hours=-11)) self.assertEqual(Timezone.fromstring('+13:59').offset, datetime.timedelta(hours=13, minutes=59)) self.assertEqual(Timezone.fromstring('-13:59').offset, datetime.timedelta(hours=-13, minutes=-59)) self.assertEqual(Timezone.fromstring('+14:00').offset, datetime.timedelta(hours=14)) self.assertEqual(Timezone.fromstring('-14:00').offset, datetime.timedelta(hours=-14)) self.assertRaises(ValueError, Timezone.fromstring, '-15:00') self.assertRaises(ValueError, Timezone.fromstring, '-14:01') self.assertRaises(ValueError, Timezone.fromstring, '+14:01') self.assertRaises(ValueError, Timezone.fromstring, '+10') self.assertRaises(ValueError, Timezone.fromstring, '+10:00:00')
def test_ne_operator(self): self.assertNotEqual(Timezone.fromstring('+05:00'), Timezone.fromstring('+06:00'))