diff --git a/etg/wxdatetime.py b/etg/wxdatetime.py index 54f252dd..0354bcd1 100644 --- a/etg/wxdatetime.py +++ b/etg/wxdatetime.py @@ -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)', """\ diff --git a/unittests/test_wxdatetime.py b/unittests/test_wxdatetime.py index e83af71f..875009dd 100644 --- a/unittests/test_wxdatetime.py +++ b/unittests/test_wxdatetime.py @@ -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) + + + + + + + #---------------------------------------------------------------------------