From c0fd2f8b396c1c16b1ebbdfca25a8ee16e61ebd5 Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Sat, 23 Feb 2008 05:56:38 +0000 Subject: [PATCH] 2008-02-23 Douglas S. Blank * src/date_test.py: removed file; moved tests to: * src/gen/lib/test/date_test.py (suite3): new tests moved tests from src/date_test.py into unit-test framework svn: r10098 --- ChangeLog | 5 + src/date_test.py | 263 ---------------------------------- src/gen/lib/test/date_test.py | 208 +++++++++++++++++++++++++-- 3 files changed, 198 insertions(+), 278 deletions(-) delete mode 100644 src/date_test.py diff --git a/ChangeLog b/ChangeLog index ba6769b0c..7d160d0a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-02-23 Douglas S. Blank + * src/date_test.py: removed file; moved tests to: + * src/gen/lib/test/date_test.py (suite3): new tests + moved tests from src/date_test.py into unit-test framework + 2008-02-22 Gary Burton * src/Editors/_EditFamily.py: Add fallback dates for birth and death Bug #1785 diff --git a/src/date_test.py b/src/date_test.py deleted file mode 100644 index e73c7344a..000000000 --- a/src/date_test.py +++ /dev/null @@ -1,263 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Gramps - a GTK+/GNOME based genealogy program -# -# Copyright (C) 2000-2006 Martin Hawlisch, Donald N. Allingham -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -# $Id$ - -"""Testscript for date displayer/parser""" - - -import os -import sys -import traceback -import locale -import gettext - -if os.environ.has_key("GRAMPSI18N"): - loc = os.environ["GRAMPSI18N"] -else: - loc = "/usr/share/locale" - -try: - locale.setlocale(locale.LC_ALL,'C') - locale.setlocale(locale.LC_ALL,'') -except locale.Error: - pass -except ValueError: - pass - -gettext.textdomain("gramps") -gettext.install("gramps",loc,unicode=1) - -import DateHandler -from DateHandler import parser as _dp -from DateHandler import displayer as _dd -from gen.lib import Date - -print locale.getlocale(locale.LC_TIME) -print _dd -print _dp -print - -date_tests = {} - -# first the "basics". -testset = "basic test" -dates = [] -calendar = Date.CAL_GREGORIAN -for quality in (Date.QUAL_NONE, Date.QUAL_ESTIMATED, Date.QUAL_CALCULATED): - for modifier in (Date.MOD_NONE, Date.MOD_BEFORE, Date.MOD_AFTER, Date.MOD_ABOUT): - for month in range(1,13): - d = Date() - d.set(quality,modifier,calendar,(4,month,1789,False),"Text comment") - dates.append( d) - for modifier in (Date.MOD_RANGE, Date.MOD_SPAN): - for month1 in range(1,13): - for month2 in range(1,13): - d = Date() - d.set(quality,modifier,calendar,(4,month1,1789,False,5,month2,1876,False),"Text comment") - dates.append( d) - modifier = Date.MOD_TEXTONLY - d = Date() - d.set(quality,modifier,calendar,Date.EMPTY,"This is a textual date") - dates.append( d) -date_tests[testset] = dates - -# incomplete dates (day or month missing) -testset = "partial date" -dates = [] -calendar = Date.CAL_GREGORIAN -for quality in (Date.QUAL_NONE, Date.QUAL_ESTIMATED, Date.QUAL_CALCULATED): - for modifier in (Date.MOD_NONE, Date.MOD_BEFORE, Date.MOD_AFTER, Date.MOD_ABOUT): - d = Date() - d.set(quality,modifier,calendar,(0,11,1789,False),"Text comment") - dates.append( d) - d = Date() - d.set(quality,modifier,calendar,(0,0,1789,False),"Text comment") - dates.append( d) - for modifier in (Date.MOD_RANGE, Date.MOD_SPAN): - d = Date() - d.set(quality,modifier,calendar,(4,10,1789,False,0,11,1876,False),"Text comment") - dates.append( d) - d = Date() - d.set(quality,modifier,calendar,(4,10,1789,False,0,0,1876,False),"Text comment") - dates.append( d) - d = Date() - d.set(quality,modifier,calendar,(0,10,1789,False,5,11,1876,False),"Text comment") - dates.append( d) - d = Date() - d.set(quality,modifier,calendar,(0,10,1789,False,0,11,1876,False),"Text comment") - dates.append( d) - d = Date() - d.set(quality,modifier,calendar,(0,10,1789,False,0,0,1876,False),"Text comment") - dates.append( d) - d = Date() - d.set(quality,modifier,calendar,(0,0,1789,False,5,11,1876,False),"Text comment") - dates.append( d) - d = Date() - d.set(quality,modifier,calendar,(0,0,1789,False,0,11,1876,False),"Text comment") - dates.append( d) - d = Date() - d.set(quality,modifier,calendar,(0,0,1789,False,0,0,1876,False),"Text comment") - dates.append( d) -date_tests[testset] = dates - -# slash-dates -testset = "slash-dates" -dates = [] -calendar = Date.CAL_GREGORIAN -for quality in (Date.QUAL_NONE, Date.QUAL_ESTIMATED, Date.QUAL_CALCULATED): - for modifier in (Date.MOD_NONE, Date.MOD_BEFORE, Date.MOD_AFTER, Date.MOD_ABOUT): - # normal date - d = Date() - d.set(quality,modifier,calendar,(4,11,1789,True),"Text comment") - dates.append( d) - for modifier in (Date.MOD_RANGE, Date.MOD_SPAN): - d = Date() - d.set(quality,modifier,calendar,(4,11,1789,True,5,10,1876,False),"Text comment") - dates.append( d) - d = Date() - d.set(quality,modifier,calendar,(4,11,1789,False,5,10,1876,True),"Text comment") - dates.append( d) - d = Date() - d.set(quality,modifier,calendar,(4,11,1789,True,5,10,1876,True),"Text comment") - dates.append( d) -date_tests[testset] = dates - -# BCE -testset = "B. C. E." -dates = [] -calendar = Date.CAL_GREGORIAN -for quality in (Date.QUAL_NONE, Date.QUAL_ESTIMATED, Date.QUAL_CALCULATED): - for modifier in (Date.MOD_NONE, Date.MOD_BEFORE, Date.MOD_AFTER, Date.MOD_ABOUT): - # normal date - d = Date() - d.set(quality,modifier,calendar,(4,11,-90,False),"Text comment") - dates.append( d) - for modifier in (Date.MOD_RANGE, Date.MOD_SPAN): - d = Date() - d.set(quality,modifier,calendar,(5,10,-90,False,4,11,-90,False),"Text comment") - dates.append( d) - d = Date() -date_tests[testset] = dates - -# test for all other different calendars -testset = "Non-gregorian" -dates = [] -for calendar in (Date.CAL_JULIAN, Date.CAL_HEBREW, Date.CAL_ISLAMIC, Date.CAL_FRENCH, Date.CAL_PERSIAN): - for quality in (Date.QUAL_NONE, Date.QUAL_ESTIMATED, Date.QUAL_CALCULATED): - for modifier in (Date.MOD_NONE, Date.MOD_BEFORE, Date.MOD_AFTER, Date.MOD_ABOUT): - d = Date() - d.set(quality,modifier,calendar,(4,11,1789,False),"Text comment") - dates.append( d) - for modifier in (Date.MOD_RANGE, Date.MOD_SPAN): - d = Date() - d.set(quality,modifier,calendar,(4,10,1789,False,5,11,1876,False),"Text comment") - dates.append( d) -quality = Date.QUAL_NONE -modifier = Date.MOD_NONE -for calendar in (Date.CAL_JULIAN, Date.CAL_ISLAMIC, Date.CAL_PERSIAN): - for month in range(1,13): - d = Date() - d.set(quality,modifier,calendar,(4,month,1789,False),"Text comment") - dates.append( d) -for calendar in (Date.CAL_HEBREW, Date.CAL_FRENCH): - for month in range(1,14): - d = Date() - d.set(quality,modifier,calendar,(4,month,1789,False),"Text comment") - dates.append( d) -date_tests[testset] = dates - -# now run the tests using all available date formats -cal_str = [ "CAL_GREGORIAN", "CAL_JULIAN", "CAL_HEBREW", "CAL_FRENCH", "CAL_PERSIAN", "CAL_ISLAMIC"] -mod_str = ["MOD_NONE", "MOD_BEFORE", "MOD_AFTER", "MOD_ABOUT", "MOD_RANGE", "MOD_SPAN", "MOD_TEXTONLY"] -qua_str = ["QUAL_NONE", "QUAL_ESTIMATED", "QUAL_CALCULATED"] -stats = {} -formats = DateHandler.get_date_formats() -for testset in date_tests.keys(): - print "\n##### %s:\n" % testset - stats[testset] = [0,0,testset] - for format in range( len( DateHandler.get_date_formats())): - DateHandler.set_format(format) - print "\n## %s:\n" % DateHandler.get_date_formats()[format] - for dateval in date_tests[testset]: - failed = True - ex = None - errmsg = "" - datestr = None - ndate = None - ntxt = None - if dateval.modifier != Date.MOD_TEXTONLY: - dateval.text = "Comment. Format: %s" % DateHandler.get_date_formats()[format] - try: - datestr = _dd.display( dateval) - try: - ndate = _dp.parse( datestr) - ntxt = _dd.display( ndate) - if ndate: - if dateval.is_equal( ndate): - failed = False - else: - if dateval.modifier != Date.MOD_TEXTONLY and ndate.modifier == Date.MOD_TEXTONLY: - errmsg = "FAILED! (was parsed as text)" - else: - errmsg = "FAILED!" - else: - errmsg = "FAILED: DateParser returned no Date" - except: - ex = "Parser" - errmsg = "FAILED: DateParser Exception %s" % ("".join(traceback.format_exception(*sys.exc_info())),) - except: - ex = "Display" - errmsg = "FAILED: DateDisplay Exception: %s" % ("".join(traceback.format_exception(*sys.exc_info())),) - if not failed: - stats[testset][1] = stats[testset][1] + 1 - print datestr - print ntxt - print "ok" - else: - stats[testset][0] = stats[testset][0] + 1 - print "input was:" - print " calendar: %s" % cal_str[dateval.calendar] - print " modifier: %s" % mod_str[dateval.modifier] - print " quality: %s" % qua_str[dateval.quality] - print " dateval: %s" % str(dateval.dateval) - print " text: '%s'" % dateval.text - if ex == "Display": - print "This date is not displayable because of an Exception:" - print errmsg - else: - print "DateDisplay gives: '%s'" % datestr - if ex == "Parser": - print "This date is not parsable because of an Exception:" - print errmsg - else: - print "parsed date was:" - print " calendar: %s" % cal_str[ndate.calendar] - print " modifier: %s" % mod_str[ndate.modifier] - print " quality: %s" % qua_str[ndate.quality] - print " dateval: %s" % str(ndate.dateval) - print " text: '%s'" % ndate.text - print "this gives:'%s'" % ntxt - print - -print "RESULT:" -for result in stats: - print "% 13s: % 5d dates ok, % 4d failed." % (stats[result][2],stats[result][1],stats[result][0]) diff --git a/src/gen/lib/test/date_test.py b/src/gen/lib/test/date_test.py index d4bed89b0..d89ae9941 100644 --- a/src/gen/lib/test/date_test.py +++ b/src/gen/lib/test/date_test.py @@ -23,11 +23,199 @@ """ Unittest for testing dates """ import unittest +import os +import sys +import traceback +import locale +import gettext + +if os.environ.has_key("GRAMPSI18N"): + loc = os.environ["GRAMPSI18N"] +else: + loc = "/usr/share/locale" + +try: + locale.setlocale(locale.LC_ALL,'C') + locale.setlocale(locale.LC_ALL,'') +except locale.Error: + pass +except ValueError: + pass + from test import test_util test_util.path_append_parent() import Config -from DateHandler import parser as df +import DateHandler +from DateHandler import parser as _dp +from DateHandler import displayer as _dd +from gen.lib import Date + +gettext.textdomain("gramps") +gettext.install("gramps",loc,unicode=1) + +date_tests = {} + +# first the "basics". +testset = "basic test" +dates = [] +calendar = Date.CAL_GREGORIAN +for quality in (Date.QUAL_NONE, Date.QUAL_ESTIMATED, Date.QUAL_CALCULATED): + for modifier in (Date.MOD_NONE, Date.MOD_BEFORE, Date.MOD_AFTER, Date.MOD_ABOUT): + for month in range(1,13): + d = Date() + d.set(quality,modifier,calendar,(4,month,1789,False),"Text comment") + dates.append( d) + for modifier in (Date.MOD_RANGE, Date.MOD_SPAN): + for month1 in range(1,13): + for month2 in range(1,13): + d = Date() + d.set(quality,modifier,calendar,(4,month1,1789,False,5,month2,1876,False),"Text comment") + dates.append( d) + modifier = Date.MOD_TEXTONLY + d = Date() + d.set(quality,modifier,calendar,Date.EMPTY,"This is a textual date") + dates.append( d) +date_tests[testset] = dates + +# incomplete dates (day or month missing) +testset = "partial date" +dates = [] +calendar = Date.CAL_GREGORIAN +for quality in (Date.QUAL_NONE, Date.QUAL_ESTIMATED, Date.QUAL_CALCULATED): + for modifier in (Date.MOD_NONE, Date.MOD_BEFORE, Date.MOD_AFTER, Date.MOD_ABOUT): + d = Date() + d.set(quality,modifier,calendar,(0,11,1789,False),"Text comment") + dates.append( d) + d = Date() + d.set(quality,modifier,calendar,(0,0,1789,False),"Text comment") + dates.append( d) + for modifier in (Date.MOD_RANGE, Date.MOD_SPAN): + d = Date() + d.set(quality,modifier,calendar,(4,10,1789,False,0,11,1876,False),"Text comment") + dates.append( d) + d = Date() + d.set(quality,modifier,calendar,(4,10,1789,False,0,0,1876,False),"Text comment") + dates.append( d) + d = Date() + d.set(quality,modifier,calendar,(0,10,1789,False,5,11,1876,False),"Text comment") + dates.append( d) + d = Date() + d.set(quality,modifier,calendar,(0,10,1789,False,0,11,1876,False),"Text comment") + dates.append( d) + d = Date() + d.set(quality,modifier,calendar,(0,10,1789,False,0,0,1876,False),"Text comment") + dates.append( d) + d = Date() + d.set(quality,modifier,calendar,(0,0,1789,False,5,11,1876,False),"Text comment") + dates.append( d) + d = Date() + d.set(quality,modifier,calendar,(0,0,1789,False,0,11,1876,False),"Text comment") + dates.append( d) + d = Date() + d.set(quality,modifier,calendar,(0,0,1789,False,0,0,1876,False),"Text comment") + dates.append( d) +date_tests[testset] = dates + +# slash-dates +testset = "slash-dates" +dates = [] +calendar = Date.CAL_GREGORIAN +for quality in (Date.QUAL_NONE, Date.QUAL_ESTIMATED, Date.QUAL_CALCULATED): + for modifier in (Date.MOD_NONE, Date.MOD_BEFORE, Date.MOD_AFTER, Date.MOD_ABOUT): + # normal date + d = Date() + d.set(quality,modifier,calendar,(4,11,1789,True),"Text comment") + dates.append( d) + for modifier in (Date.MOD_RANGE, Date.MOD_SPAN): + d = Date() + d.set(quality,modifier,calendar,(4,11,1789,True,5,10,1876,False),"Text comment") + dates.append( d) + d = Date() + d.set(quality,modifier,calendar,(4,11,1789,False,5,10,1876,True),"Text comment") + dates.append( d) + d = Date() + d.set(quality,modifier,calendar,(4,11,1789,True,5,10,1876,True),"Text comment") + dates.append( d) +date_tests[testset] = dates + +# BCE +testset = "B. C. E." +dates = [] +calendar = Date.CAL_GREGORIAN +for quality in (Date.QUAL_NONE, Date.QUAL_ESTIMATED, Date.QUAL_CALCULATED): + for modifier in (Date.MOD_NONE, Date.MOD_BEFORE, Date.MOD_AFTER, Date.MOD_ABOUT): + # normal date + d = Date() + d.set(quality,modifier,calendar,(4,11,-90,False),"Text comment") + dates.append( d) + for modifier in (Date.MOD_RANGE, Date.MOD_SPAN): + d = Date() + d.set(quality,modifier,calendar,(5,10,-90,False,4,11,-90,False),"Text comment") + dates.append( d) + d = Date() +date_tests[testset] = dates + +# test for all other different calendars +testset = "Non-gregorian" +dates = [] +for calendar in (Date.CAL_JULIAN, Date.CAL_HEBREW, Date.CAL_ISLAMIC, Date.CAL_FRENCH, Date.CAL_PERSIAN): + for quality in (Date.QUAL_NONE, Date.QUAL_ESTIMATED, Date.QUAL_CALCULATED): + for modifier in (Date.MOD_NONE, Date.MOD_BEFORE, Date.MOD_AFTER, Date.MOD_ABOUT): + d = Date() + d.set(quality,modifier,calendar,(4,11,1789,False),"Text comment") + dates.append( d) + for modifier in (Date.MOD_RANGE, Date.MOD_SPAN): + d = Date() + d.set(quality,modifier,calendar,(4,10,1789,False,5,11,1876,False),"Text comment") + dates.append( d) +quality = Date.QUAL_NONE +modifier = Date.MOD_NONE +for calendar in (Date.CAL_JULIAN, Date.CAL_ISLAMIC, Date.CAL_PERSIAN): + for month in range(1,13): + d = Date() + d.set(quality,modifier,calendar,(4,month,1789,False),"Text comment") + dates.append( d) +for calendar in (Date.CAL_HEBREW, Date.CAL_FRENCH): + for month in range(1,14): + d = Date() + d.set(quality,modifier,calendar,(4,month,1789,False),"Text comment") + dates.append( d) +date_tests[testset] = dates + +# now run the tests using all available date formats +cal_str = [ "CAL_GREGORIAN", "CAL_JULIAN", "CAL_HEBREW", "CAL_FRENCH", "CAL_PERSIAN", "CAL_ISLAMIC"] +mod_str = ["MOD_NONE", "MOD_BEFORE", "MOD_AFTER", "MOD_ABOUT", "MOD_RANGE", "MOD_SPAN", "MOD_TEXTONLY"] +qua_str = ["QUAL_NONE", "QUAL_ESTIMATED", "QUAL_CALCULATED"] +formats = DateHandler.get_date_formats() + +class Eval(unittest.TestCase): + def __init__(self, method_name, dateval, e1, e2, e3): + self.__dict__[method_name] = lambda: eval_func(dateval, e1, e2, e3) + unittest.TestCase.__init__(self, method_name) + +def eval_func(dateval, e1, e2, e3): + exec(e1) + exec(e2) + exec(e3) + #print datestr, ndate, ntxt + assert(dateval.is_equal(ndate), "dates are not the same") + +def suite3(): + suite = unittest.TestSuite() + count = 1 + for testset in date_tests.keys(): + for format in range( len( DateHandler.get_date_formats())): + DateHandler.set_format(format) + for dateval in date_tests[testset]: + if dateval.modifier != Date.MOD_TEXTONLY: + dateval.text = "Comment. Format: %s" % DateHandler.get_date_formats()[format] + suite.addTest(Eval("test_eval%04d" % count, dateval, + "datestr = _dd.display(dateval)", + "ndate = _dp.parse(datestr)", + "ntxt = _dd.display(ndate)")) + count += 1 + return suite class Tester(unittest.TestCase): def __init__(self, method_name, part, testdata): @@ -46,8 +234,8 @@ class Tester(unittest.TestCase): pos2 = 1 if expected2 : pos2 = 0 - date1 = df.parse(d1) - date2 = df.parse(d2) + date1 = _dp.parse(d1) + date2 = _dp.parse(d2) if part == 1: val = date2.match(date1) self.assertTrue(val == expected1, "'%s' and '%s' did not match" % (d1, d2)) @@ -55,7 +243,6 @@ class Tester(unittest.TestCase): val = date1.match(date2) self.assertTrue(val == expected2, "'%s' and '%s' did not match" % (d2, d1)) - def suite(): """ interface to automated test runner test/regrtest.py """ Config.set(Config.DATE_BEFORE_RANGE, 9999) @@ -134,7 +321,6 @@ def suite(): return suite def assert_func(exp1, exp2): - Date = date.Date e1 = eval(exp1) e2 = eval(exp2) assert e1 == e2, "%s should be %s but was %s" % (exp1, e2, e1) @@ -169,20 +355,11 @@ def suite2(): ("Date(2000, 1, 1) - 1", "Date(1999, 1, 1)"), ("Date(2000) - 1", "Date(1999)"), ("Date(2000) + 1", "Date(2001)"), - -#My great great grandfather died on 1876-05-07. -#He died at an age of 65 years, 5 month 17 days according to the books: -#> Date(1876,5,7)-(65,5,17) -#1811-12-21 -#> Date(1876,5,7)-Date(1811,12,21) -#(64, 4, 17) -#But his correct birth date is 1810-11-20: -#("Date(1876,5,7)-Date(1810,11,20)", "(65, 5, 18)") + # Date +/- Date -> tuple ("Date(1876,5,7) - Date(1876,5,1)", "(0, 0, 6)"), ("Date(1876,5,7) - Date(1876,4,30)", "(0, 0, 7)"), ("Date(2000,1,1) - Date(1999,2,1)", "(0, 11, 0)"), ("Date(2000,1,1) - Date(1999,12,1)", "(0, 1, 0)"), - # Date +/- Date -> tuple ("Date(2007, 12, 23) - Date(1963, 12, 4)", "(44, 0, 19)"), ] suite = unittest.TestSuite() @@ -195,3 +372,4 @@ def suite2(): if __name__ == "__main__": unittest.TextTestRunner().run(suite()) unittest.TextTestRunner().run(suite2()) + unittest.TextTestRunner().run(suite3())