Change the wx.DateTime.Parse*() to be like they were in Classic, returning a -1 on failure, or the number of characters parsed otherwise.

Add some unit tests to exercise the new methods.
This commit is contained in:
Robin Dunn
2015-02-25 00:00:23 -08:00
parent e308d980b2
commit 15e911fd96
2 changed files with 151 additions and 28 deletions

View File

@@ -159,48 +159,86 @@ def run():
c.find('Subtract').findOverload('wxDateSpan', isConst=True).ignore()
c.find('Subtract').findOverload('wxTimeSpan', isConst=True).ignore()
# Ignore the end parameter for the parse methods, and provide replacement
# implementations that don't need them.
c.find('ParseDate.end').ignore()
c.find('ParseTime.end').ignore()
c.find('ParseDateTime.end').ignore()
c.find('ParseRfc822Date.end').ignore()
for m in c.find('ParseFormat').all():
# Ignore the end parameter for the Parse*() methods, and provide
# replacement implementations that don't need them. Change them to be
# like they were in Classic, returning a -1 on failure, or the number of
# characters parsed otherwise.
def fixParseMethod(m, code):
assert isinstance(m, etgtools.MethodDef)
m.find('end').ignore()
m.type = 'int'
m.setCppCode(code)
return m
c.find('ParseDate').setCppCode("""\
fixParseMethod(c.find('ParseDate'), """\
wxString::const_iterator begin = date->begin();
wxString::const_iterator end;
return self->ParseDate(*date, &end);
""")
c.find('ParseTime').setCppCode("""\
wxString::const_iterator end;
return self->ParseTime(*time, &end);
""")
c.find('ParseDateTime').setCppCode("""\
wxString::const_iterator end;
return self->ParseDateTime(*datetime, &end);
""")
c.find('ParseRfc822Date').setCppCode("""\
wxString::const_iterator end;
return self->ParseRfc822Date(*date, &end);
if (! self->ParseDate(*date, &end))
return -1;
return end - begin;
""")
fixParseMethod(c.find('ParseDateTime'), """\
wxString::const_iterator begin = datetime->begin();
wxString::const_iterator end;
if (! self->ParseDateTime(*datetime, &end))
return -1;
return end - begin;
""")
fixParseMethod(c.find('ParseTime'), """\
wxString::const_iterator begin = time->begin();
wxString::const_iterator end;
if (! self->ParseTime(*time, &end))
return -1;
return end - begin;
""")
fixParseMethod(c.find('ParseRfc822Date'), """\
wxString::const_iterator begin = date->begin();
wxString::const_iterator end;
if (! self->ParseRfc822Date(*date, &end))
return -1;
return end - begin;
""")
pf = c.find('ParseFormat')
pf.findOverload('const wxString &date, const wxString &format, const wxDateTime &dateDef, wxString::').setCppCode(
pf1 = fixParseMethod(
pf.findOverload('const wxString &date, const wxString &format, const wxDateTime &dateDef, wxString::'),
"""\
wxString::const_iterator begin = date->begin();
wxString::const_iterator end;
return self->ParseFormat(*date, *format, *dateDef, &end);
if (! self->ParseFormat(*date, *format, *dateDef, &end))
return -1;
return end - begin;
""")
pf.findOverload('const wxString &date, const wxString &format, wxString::').setCppCode(
pf2 = fixParseMethod(
pf.findOverload('const wxString &date, const wxString &format, wxString::'),
"""\
wxString::const_iterator begin = date->begin();
wxString::const_iterator end;
return self->ParseFormat(*date, *format, &end);
if (! self->ParseFormat(*date, *format, &end))
return -1;
return end - begin;
""")
pf.findOverload('const wxString &date, wxString::').setCppCode(
pf3 = fixParseMethod(
pf.findOverload('const wxString &date, wxString::'),
"""\
wxString::const_iterator begin = date->begin();
wxString::const_iterator end;
return self->ParseFormat(*date, &end);
if (! self->ParseFormat(*date, &end))
return -1;
return end - begin;
""")
c.addPyMethod('__repr__', '(self)', """\

View File

@@ -140,8 +140,93 @@ class datetime_Tests(wtc.WidgetTestCase):
d2 = wx.pydate2wxdate(pd)
self.assertTrue(isinstance(pd, datetime.datetime))
self.assertEqual(d1, d2)
def test_datetimeParseDate1(self):
d = wx.DateTime()
val = d.ParseDate('bogus')
self.assertEqual(val, -1)
def test_datetimeParseDate2(self):
d = wx.DateTime()
val = d.ParseDate('10/25/2015')
self.assertEqual(val, 10)
self.assertEqual(d.year, 2015)
self.assertEqual(d.month, wx.DateTime.Oct)
self.assertEqual(d.day, 25)
def test_datetimeParseDate3(self):
d = wx.DateTime()
val = d.ParseDate('10/25/2015 non-date text')
self.assertEqual(val, 13)
def test_datetimeParseDateTime1(self):
d = wx.DateTime()
val = d.ParseDateTime('bogus')
self.assertEqual(val, -1)
def test_datetimeParseDateTime2(self):
d = wx.DateTime()
val = d.ParseDateTime('10/25/2015 12:25')
self.assertEqual(val, 16)
self.assertEqual(d.year, 2015)
self.assertEqual(d.month, wx.DateTime.Oct)
self.assertEqual(d.day, 25)
self.assertEqual(d.hour, 12)
self.assertEqual(d.minute, 25)
def test_datetimeParseDateTime3(self):
d = wx.DateTime()
val = d.ParseDateTime('10/25/2015 12:25 non-date text')
self.assertEqual(val, 16)
def test_datetimeParseTime1(self):
d = wx.DateTime()
val = d.ParseTime('12:25')
self.assertEqual(val, 5)
self.assertEqual(d.hour, 12)
self.assertEqual(d.minute, 25)
def test_datetimeParseRfc822Date(self):
d = wx.DateTime()
val = d.ParseRfc822Date('Wed, 25 Feb 2015 13:34:45 -0800')
self.assertEqual(val, 31)
self.assertEqual(d.hour, 13)
self.assertEqual(d.minute, 34)
def test_datetimeParseFormat1(self):
d = wx.DateTime()
defDate = wx.DateTime.FromHMS(1,2,3,4)
val = d.ParseFormat('2015-10-11', '%Y-%m-%d', defDate)
self.assertEqual(val, 10)
self.assertEqual(d.year, 2015)
self.assertEqual(d.month, wx.DateTime.Oct)
self.assertEqual(d.day, 11)
self.assertEqual(d.hour, 1)
self.assertEqual(d.minute, 2)
self.assertEqual(d.second, 3)
self.assertEqual(d.millisecond, 4)
def test_datetimeParseFormat2(self):
d = wx.DateTime()
val = d.ParseFormat('2015-10-11', '%Y-%m-%d')
self.assertEqual(val, 10)
self.assertEqual(d.year, 2015)
self.assertEqual(d.month, wx.DateTime.Oct)
self.assertEqual(d.day, 11)
#---------------------------------------------------------------------------