Skip to content

Commit

Permalink
Allow to store multiple family events of the same type
Browse files Browse the repository at this point in the history
  • Loading branch information
albarin committed Aug 21, 2024
1 parent 3cfd212 commit 59aa6a2
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 10 deletions.
20 changes: 16 additions & 4 deletions src/Record/Fam.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,13 @@ class Fam extends \Gedcom\Record implements Noteable, Sourceable, Objectable

public function addEven($recordType, $even)
{
$this->_even[$recordType] = $even;
if (!array_key_exists($recordType, $this->_even)) {
$this->_even[$recordType] = [];
}

$this->_even[$recordType][] = $even;

return $this;
}

/**
Expand All @@ -61,12 +67,18 @@ public function getAllEven()
}

/**
* @return void|\Gedcom\Record\Fam\Even
* @return void|\Gedcom\Record\Fam\Even|\Gedcom\Record\Fam\Even[]
*/
public function getEven($key = '')
{
if (isset($this->_even[strtoupper((string) $key)])) {
return $this->_even[strtoupper((string) $key)];
$key = strtoupper((string) $key);

if (isset($this->_even[$key])) {
if (count($this->_even[$key]) === 1) {
return $this->_even[$key][0];
}

return $this->_even[$key];
}
}

Expand Down
10 changes: 6 additions & 4 deletions src/Writer/Fam.php
Original file line number Diff line number Diff line change
Expand Up @@ -139,10 +139,12 @@ public static function convert(\Gedcom\Record\Fam &$fam, $level = 0)
// EVEN
$even = $fam->getAllEven();
if (!empty($even) && $even !== []) {
foreach ($even as $eventType => $item) {
if ($item) {
$_convert = \Gedcom\Writer\Fam\Even::convert($item, $eventType, $level);
$output .= $_convert;
foreach ($even as $eventType => $items) {
foreach ($items as $item) {
if ($item) {
$_convert = \Gedcom\Writer\Fam\Even::convert($item, $eventType, $level);
$output .= $_convert;
}
}
}
}
Expand Down
61 changes: 59 additions & 2 deletions tests/library/Gedcom/FamParserTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public function testFamilyEventWithNoTypeIsParsed()
$this->assertCount(1, $events);

$eventType = array_keys($events)[0];
$event = $events[$eventType];
$event = $events[$eventType][0];

$this->assertEquals('MARR', $eventType);
$this->assertEquals('MARR', $event->getType());
Expand All @@ -56,9 +56,66 @@ public function testFamilyEventWithTypeIsParsed()
$this->assertCount(1, $events);

$eventType = array_keys($events)[0];
$event = $events[$eventType];
$event = $events[$eventType][0];

$this->assertEquals('MARR', $eventType);
$this->assertEquals('Civil marriage', $event->getType());
}

/**
* Test multiple events of the same type are kept.
*/
public function testMultipleEventsOfTheSameTypeAreKept()
{
$this->gedcom = $this->parser->parse(\TEST_DIR.'/stresstestfiles/family/family_multiple_events.ged');
$fam = $this->gedcom->getFam('F1');

$events = $fam['F1']->getAllEven();
$this->assertCount(2, $events['MARR']);

$eventTypes = array_keys($events);
$this->assertEquals('MARR', $eventTypes[0]);

$event1 = $events['MARR'][0];
$event2 = $events['MARR'][1];

$this->assertEquals('First civil marriage', $event1->getType());
$this->assertEquals('Second civil marriage', $event2->getType());
}

/**
* Test get even returns a single event.
*/
public function testGetEvenReturnsASingleEvent()
{
$this->gedcom = $this->parser->parse(\TEST_DIR.'/stresstestfiles/family/family_event_with_type.ged');

$fam = $this->gedcom->getFam('F1');

$event = $fam['F1']->getEven('MARR');
$this->assertInstanceOf(\Gedcom\Record\Fam\Even::class, $event);

$this->assertEquals('Civil marriage', $event->getType());
}

/**
* Test get even returns multiple events.
*/
public function testGetEvenReturnsMultipleEvents()
{
$this->gedcom = $this->parser->parse(\TEST_DIR.'/stresstestfiles/family/family_multiple_events.ged');

$fam = $this->gedcom->getFam('F1');

$events = $fam['F1']->getEven('MARR');
$this->assertCount(2, $events);

$event1 = $events[0];
$event2 = $events[1];
$this->assertInstanceOf(\Gedcom\Record\Fam\Even::class, $event1);
$this->assertInstanceOf(\Gedcom\Record\Fam\Even::class, $event2);

$this->assertEquals('First civil marriage', $event1->getType());
$this->assertEquals('Second civil marriage', $event2->getType());
}
}
1 change: 1 addition & 0 deletions tests/library/Gedcom/FamWriterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public static function families()
return [
[\TEST_DIR.'/stresstestfiles/family/family_event_no_type.ged'],
[\TEST_DIR.'/stresstestfiles/family/family_event_with_type.ged'],
[\TEST_DIR.'/stresstestfiles/family/family_multiple_events.ged'],
];
}
}
6 changes: 6 additions & 0 deletions tests/stresstestfiles/family/family_multiple_events.ged
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
0 @F1@ FAM
1 MARR
2 TYPE First civil marriage
1 MARR
2 TYPE Second civil marriage
0 TRLR

0 comments on commit 59aa6a2

Please sign in to comment.