6817: Enhancements for testing localized Relationship handlers (contribution by Fedir)

svn: r22538
This commit is contained in:
Jérôme Rapinat 2013-06-20 14:36:32 +00:00
parent dadd00f200
commit 37f3183c3b
2 changed files with 435 additions and 331 deletions

View File

@ -1859,7 +1859,7 @@ def get_relationship_calculator(reinit=False):
#
#-------------------------------------------------------------------------
def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
def _test(rc, onlybirth, inlawa, inlawb, printrelstr, testNum = None):
""" this is a generic test suite for the singular relationship
TRANSLATORS: do NOT translate, use __main__ !
"""
@ -1884,10 +1884,36 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
FMT = '%+50s'
MAX = 30
#rc = RelationshipCalculator()
if testNum == None:
print("""
Select a test:
0 - all tests
1 - testing sons
2 - testing daughters
3 - testing unknown children
4 - testing grandfathers
5 - testing grandmothers
6 - testing unknown parents
7 - testing nieces
8 - testing nephews
9 - testing unknown nephews/nieces
10 - testing uncles
11 - testing aunts
12 - testing unknown uncles/aunts
13 - testing male cousins same generation
14 - testing female cousins same generation
15 - testing unknown cousins same generation
16 - testing some cousins up
17 - testing some cousins down
print '\ntesting sons (Enter to start)\n'
sys.stdin.readline()
Please enter a test number and press Enter for continue:
""")
testNum = sys.stdin.readline().strip()
testNum = int(testNum)
if testNum == 0 or testNum == 1:
print('\ntesting sons')
#sys.stdin.readline()
for i in range(MAX) :
relstr = _rand_relstr(i,'f')
rel = FMT % rc.get_single_relationship_string(0, i,
@ -1898,11 +1924,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
in_law_a=inlawa,
in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstr)
else:
print rel
print '\n\ntesting daughters\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 2:
print('\ntesting daughters\n')
#sys.stdin.readline()
for i in range(MAX) :
relstr = _rand_relstr(i,'m')
rel = FMT % rc.get_single_relationship_string(0, i,
@ -1912,11 +1939,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstr)
else:
print rel
print '\n\ntesting unknown children\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 3:
print('\ntesting unknown children\n')
#sys.stdin.readline()
for i in range(MAX) :
relstr = _rand_relstr(i,'f')
rel = FMT % rc.get_single_relationship_string(0, i,
@ -1926,11 +1954,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstr)
else:
print rel
print '\n\ntesting grandfathers\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 4:
print('\ntesting grandfathers\n')
#sys.stdin.readline()
for i in range(MAX) :
relstr = _rand_relstr(i,'f')
rel = FMT % rc.get_single_relationship_string(i, 0,
@ -1940,11 +1969,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstr)
else:
print rel
print '\n\ntesting grandmothers\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 5:
print('\ntesting grandmothers\n')
#sys.stdin.readline()
for i in range(MAX) :
relstr = _rand_relstr(i,'m')
rel = FMT % rc.get_single_relationship_string(i, 0,
@ -1954,11 +1984,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstr)
else:
print rel
print '\n\ntesting unknown parents\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 6:
print('\ntesting unknown parents\n')
#sys.stdin.readline()
for i in range(MAX) :
relstr = _rand_relstr(i,'f')
rel = FMT % rc.get_single_relationship_string(i, 0,
@ -1968,11 +1999,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstr)
else:
print rel
print '\n\ntesting nieces\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 7:
print('\ntesting nieces\n')
#sys.stdin.readline()
for i in range(1, MAX) :
relstr = _rand_relstr(i,'m')
rel = FMT % rc.get_single_relationship_string(1, i,
@ -1982,11 +2014,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstr)
else:
print rel
print '\n\ntesting nephews\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 8:
print('\ntesting nephews\n')
#sys.stdin.readline()
for i in range(1, MAX) :
relstr = _rand_relstr(i,'f')
rel = FMT % rc.get_single_relationship_string(1, i,
@ -1996,11 +2029,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstr)
else:
print rel
print '\n\ntesting unknown nephews/nieces\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 9:
print('\ntesting unknown nephews/nieces\n')
#sys.stdin.readline()
for i in range(1, MAX) :
relstr = _rand_relstr(i,'f')
rel = FMT % rc.get_single_relationship_string(1, i,
@ -2010,11 +2044,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstr)
else:
print rel
print '\n\ntesting uncles\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 10:
print('\ntesting uncles\n')
#sys.stdin.readline()
for i in range(1, MAX) :
relstr = _rand_relstr(i,'f')
rel = FMT % rc.get_single_relationship_string(i, 1,
@ -2024,11 +2059,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstr)
else:
print rel
print '\n\ntesting aunts\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 11:
print('\ntesting aunts\n')
#sys.stdin.readline()
for i in range(1, MAX) :
relstr = _rand_relstr(i,'f')
rel = FMT % rc.get_single_relationship_string(i, 1,
@ -2038,11 +2074,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstr)
else:
print rel
print '\n\ntesting unknown uncles/aunts\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 12:
print('\ntesting unknown uncles/aunts\n')
#sys.stdin.readline()
for i in range(1, MAX) :
relstr = _rand_relstr(i,'m')
rel = FMT % rc.get_single_relationship_string(i, 1,
@ -2052,11 +2089,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstr)
else:
print rel
print '\n\ntesting male cousins same generation\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 13:
print('\ntesting male cousins same generation\n')
#sys.stdin.readline()
for i in range(1, MAX) :
relstra = _rand_relstr(i,'f')
relstrb = _rand_relstr(i,'f')
@ -2068,11 +2106,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstra, relstrb
print(rel + ' |info:', relstra, relstrb)
else:
print rel
print '\n\ntesting female cousins same generation\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 14:
print('\ntesting female cousins same generation\n')
#sys.stdin.readline()
for i in range(1, MAX) :
relstra = _rand_relstr(i,'m')
relstrb = _rand_relstr(i,'m')
@ -2084,11 +2123,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstra, relstrb
print(rel + ' |info:', relstra, relstrb)
else:
print rel
print '\n\ntesting unknown cousins same generation\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 15:
print('\ntesting unknown cousins same generation\n')
#sys.stdin.readline()
for i in range(1, MAX) :
relstra = _rand_relstr(i,'m')
relstrb = _rand_relstr(i,'m')
@ -2100,11 +2140,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb)
if printrelstr :
print rel + ' |info:', relstra, relstrb
print(rel + ' |info:', relstra, relstrb)
else:
print rel
print '\n\ntesting some cousins up\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 16:
print('\ntesting some cousins up\n')
#sys.stdin.readline()
import random
random.seed()
for i in range(1, MAX) :
@ -2122,9 +2163,9 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb), j, i )
if printrelstr :
print rel + ' |info:', relstra, relstrb
print(rel + ' |info:', relstra, relstrb)
else:
print rel
print(rel)
else:
rel = (FMT + ' |info: male, Ga=%2d, Gb=%2d') % (
rc.get_single_relationship_string(j, i,
@ -2134,11 +2175,12 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb), j, i )
if printrelstr :
print rel + ' |info:', relstra, relstrb
print(rel + ' |info:', relstra, relstrb)
else:
print rel
print '\n\ntesting some cousins down\n'
sys.stdin.readline()
print(rel)
if testNum == 0 or testNum == 17:
print('\ntesting some cousins down\n')
#sys.stdin.readline()
for i in range(1, MAX) :
for j in range (i, MAX) :
rnd = random.randint(0, 100)
@ -2154,9 +2196,9 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb), i, j)
if printrelstr :
print rel + ' |info:', relstra, relstrb
print(rel + ' |info:', relstra, relstrb)
else:
print rel
print(rel)
else:
rel = (FMT + ' |info: male, Ga=%2d, Gb=%2d') % (
rc.get_single_relationship_string(i, j,
@ -2166,9 +2208,9 @@ def _test(rc, onlybirth, inlawa, inlawb, printrelstr):
only_birth=onlybirth,
in_law_a=inlawa, in_law_b=inlawb), i, j)
if printrelstr :
print rel + ' |info:', relstr
print(rel + ' |info:', relstra, relstrb)
else:
print rel
print(rel)
def _testsibling(rc):
vals = [(rc.NORM_SIB, 'sibling'),
@ -2181,9 +2223,9 @@ def _testsibling(rc):
(UNKNOWN, 'unknown')]:
for inlaw in [False, True]:
for sibt, str in vals:
print FMT % rc.get_sibling_relationship_string(
print(FMT % rc.get_sibling_relationship_string(
sibt, MALE, gendr,
in_law_a = inlaw) + ' |info:', str, strgen
in_law_a = inlaw) + ' |info:', str, strgen)
def _test_spouse(rc):
FMT = '%+50s'
@ -2199,9 +2241,9 @@ def _test_spouse(rc):
(FEMALE, 'female'),
(UNKNOWN, 'unknown')] :
for spouse_type, str in vals:
print FMT % rc.get_partner_relationship_string(
print(FMT % rc.get_partner_relationship_string(
spouse_type, MALE, gender) + \
' |info: gender='+strgen+', rel='+str
' |info: gender='+strgen+', rel='+str)
def test(rc, printrelstr):
""" this is a generic test suite for the singular relationship
@ -2209,31 +2251,53 @@ def test(rc, printrelstr):
__main__ in the rel_xx.py module.
"""
import sys
import argparse
print '\nType y to do a test\n\n'
print 'Test normal relations?'
data = sys.stdin.readline()
if data == 'y\n':
_test(rc, True, False, False, printrelstr)
print '\n\nTest step relations?'
data = sys.stdin.readline()
if data == 'y\n':
_test(rc, False, False, False, printrelstr)
print '\n\nTest in-law relations (first pers)?'
data = sys.stdin.readline()
if data == 'y\n':
_test(rc, True, True, False, printrelstr)
print '\n\nTest step and in-law relations?'
data = sys.stdin.readline()
if data == 'y\n':
_test(rc, False, True, False, printrelstr)
print '\n\nTest sibling types?'
data = sys.stdin.readline()
if data == 'y\n':
parser = argparse.ArgumentParser(description='Test the Relationship Calculator')
parser.add_argument('-r', type=int, help = 'type of the relations test')
parser.add_argument('-s', type=int, help = 'type of the singular relationship test')
args = parser.parse_args()
testNum = args.r
if testNum == None:
print("""
Select a test:
0 - all tests
1 - Test normal relations
2 - Test step relations
3 - Test in-law relations (first pers)
4 - Test step and in-law relations
5 - Test sibling types
6 - Test partner types
Please enter a test number and press Enter for continue:
""")
testNum = sys.stdin.readline().strip()
testNum = int(testNum)
if testNum == 0 or testNum == 1:
print('\n\n=== Test normal relations ===')
_test(rc, True, False, False, printrelstr, args.s)
if testNum == 0 or testNum == 2:
print('\n\n=== Test step relations ===')
_test(rc, False, False, False, printrelstr, args.s)
if testNum == 0 or testNum == 3:
print('\n\n=== Test in-law relations (first pers) ===')
_test(rc, True, True, False, printrelstr, args.s)
if testNum == 0 or testNum == 4:
print('\n\n=== Test step and in-law relations ===')
_test(rc, False, True, False, printrelstr, args.s)
if testNum == 0 or testNum == 5:
print('\n\n=== Test sibling types ===')
_testsibling(rc)
print '\n\nTest partner types?'
data = sys.stdin.readline()
if data == 'y\n':
if testNum == 0 or testNum == 6:
print('\n\n=== Test partner types ===')
_test_spouse(rc)
if __name__ == "__main__":

View File

@ -57,6 +57,7 @@ import DateHandler
import gen.lib
import Utils
import ThumbNails
import Relationship
from gen.utils import get_birth_or_fallback, get_death_or_fallback
#------------------------------------------------------------------------
@ -122,6 +123,10 @@ class RelGraphReport(Report):
get_option_by_name = options.menu.get_option_by_name
get_value = lambda name: get_option_by_name(name).get_value()
self.center_person = database.get_person_from_gramps_id(get_value('pid'))
self.increlname = get_value('increlname')
self.advrelinfo = get_value('advrelinfo')
self.includeid = get_value('incid')
self.includedates = get_value('incdate')
self.includeurl = get_value('url')
@ -158,6 +163,10 @@ class RelGraphReport(Report):
filter_option = get_option_by_name('filter')
self._filter = filter_option.get_filter()
if self.increlname :
# init Relationship Calcilator
self.relationship = Relationship.get_relationship_calculator()
def write_report(self):
self.person_handles = self._filter.apply(self.database,
self.database.iter_person_handles())
@ -326,6 +335,9 @@ class RelGraphReport(Report):
elif gender == person.UNKNOWN:
shape = "hexagon"
if person == self.center_person and self.increlname:
shape = "octagon"
if self.colorize == 'colored':
if gender == person.MALE:
color = self.colors['male']
@ -402,11 +414,27 @@ class RelGraphReport(Report):
birth, death = self.get_date_strings(person)
label = label + '%s(%s - %s)' % (lineDelimiter, birth, death)
if self.increlname :
# Display Relationship info
if self.advrelinfo:
(relation, Ga, Gb) = self.relationship.get_one_relationship(self.database, self.center_person, person, True)
else:
relation = self.relationship.get_one_relationship(self.database, self.center_person, person)
if self.bUseHtmlOutput:
label += '<BR/>' + relation
if self.advrelinfo:
label += '<BR/>Ga=%d Gb=%d' % (Ga, Gb)
else:
label += "%s%s" % (lineDelimiter, relation)
if self.advrelinfo:
label += "%sGa=%d Gb=%d" % (lineDelimiter, Ga, Gb)
# see if we have a table that needs to be terminated
if self.bUseHtmlOutput:
label += '</TD></TR></TABLE>'
return label
else :
else:
# non html label is enclosed by "" so escape other "
return label.replace('"', '\\\"')
@ -477,7 +505,7 @@ class RelGraphOptions(MenuReportOptions):
self.__filter.set_help(
_("Determines what people are included in the graph"))
add_option("filter", self.__filter)
self.__filter.connect('value-changed', self.__filter_changed)
#self.__filter.connect('value-changed', self.__filter_changed)
self.__pid = PersonOption(_("Filter Person"))
self.__pid.set_help(_("The center person for the filter"))
@ -486,6 +514,18 @@ class RelGraphOptions(MenuReportOptions):
self.__update_filters()
self.__include_relname = BooleanOption(
_("Include Relationships"), True)
self.__include_relname.set_help(_("Include the Relationships"
"names, for display relations to the center person"))
add_option("increlname", self.__include_relname)
self.__include_advrelinfo = BooleanOption(
_("Advanced Relationships info"), False)
self.__include_advrelinfo.set_help(_("Include Ga and Gb info,"
" useful for debug the Relationship calculator"))
add_option("advrelinfo", self.__include_advrelinfo)
self.incdate = BooleanOption(
_("Include Birth, Marriage and Death dates"), True)
self.incdate.set_help(_("Include the dates that the individual was "
@ -604,18 +644,18 @@ class RelGraphOptions(MenuReportOptions):
else:
self.justyears.set_available(False)
def __filter_changed(self):
"""
Handle filter change. If the filter is not specific to a person,
disable the person option
"""
filter_value = self.__filter.get_value()
if filter_value in [1, 2, 3, 4]:
# Filters 1, 2, 3 and 4 rely on the center person
self.__pid.set_available(True)
else:
# The rest don't
self.__pid.set_available(False)
#def __filter_changed(self):
#"""
#Handle filter change. If the filter is not specific to a person,
#disable the person option
#"""
#filter_value = self.__filter.get_value()
#if filter_value in [1, 2, 3, 4]:
## Filters 1, 2, 3 and 4 rely on the center person
#self.__pid.set_available(True)
#else:
## The rest don't
#self.__pid.set_available(False)
def __image_changed(self):
"""