diff --git a/app/CustomTags/Heredis.php b/app/CustomTags/Heredis.php index d3e8052c07..482fb3c637 100644 --- a/app/CustomTags/Heredis.php +++ b/app/CustomTags/Heredis.php @@ -21,15 +21,41 @@ use Fisharebest\Webtrees\Contracts\CustomTagInterface; use Fisharebest\Webtrees\Contracts\ElementInterface; +use Fisharebest\Webtrees\Elements\AddressEmail; +use Fisharebest\Webtrees\Elements\AddressWebPage; +use Fisharebest\Webtrees\Elements\AgeAtEvent; use Fisharebest\Webtrees\Elements\CertaintyAssessment; +use Fisharebest\Webtrees\Elements\Coordinates; use Fisharebest\Webtrees\Elements\Creation; +use Fisharebest\Webtrees\Elements\CustomBooleanFact; use Fisharebest\Webtrees\Elements\CustomElement; +use Fisharebest\Webtrees\Elements\DateValueExact; +use Fisharebest\Webtrees\Elements\EmptyElement; +use Fisharebest\Webtrees\Elements\HeredisFIL; +use Fisharebest\Webtrees\Elements\HeredisFNA; +use Fisharebest\Webtrees\Elements\HeredisQualEvid; +use Fisharebest\Webtrees\Elements\HeredisQualInfo; +use Fisharebest\Webtrees\Elements\HeredisQualSour; +use Fisharebest\Webtrees\Elements\HeredisRechElement; +use Fisharebest\Webtrees\Elements\HeredisUST; +use Fisharebest\Webtrees\Elements\NoteStructure; +use Fisharebest\Webtrees\Elements\PlaceLatitude; +use Fisharebest\Webtrees\Elements\PlaceLongtitude; +use Fisharebest\Webtrees\Elements\PlaceName; +use Fisharebest\Webtrees\Elements\RoleInEvent; +use Fisharebest\Webtrees\Elements\SourceCallNumber; +use Fisharebest\Webtrees\Elements\TimeValue; +use Fisharebest\Webtrees\Elements\Uid; +use Fisharebest\Webtrees\Elements\UserReferenceNumber; use Fisharebest\Webtrees\I18N; /** * GEDCOM files created by Heredis * * @see https://www.heredis.com + * + * Reference: https://help.heredis.com/les-tags-gedcom/ and https://help.heredis.com/en/gedcom-tags/ + * Example GEDCOM fragment with lots of custom tags: https://www.geneanet.org/forum/viewtopic.php?p=2441735 */ class Heredis implements CustomTagInterface { @@ -51,18 +77,67 @@ public function name(): string public function tags(): array { return [ + 'HEAD:_GUID' => new Uid(I18N::translate('File identifier')), 'FAM:_CREA' => new Creation(I18N::translate('Created at')), + 'FAM:_UST' => new HeredisUST(I18N::translate('Union type')), + 'FAM:*:DATE:_TIME' => new TimeValue(I18N::translate('Time')), + 'FAM:*:PLAC:_SUBMAP' => new Coordinates(I18N::translate('Geolocation of subdivisions')), + 'FAM:*:PLAC:_SUBMAP:LATI' => new PlaceLatitude(I18N::translate('Latitude of subdivision')), + 'FAM:*:PLAC:_SUBMAP:LONG' => new PlaceLongtitude(I18N::translate('Longitude of subdivision')), + 'FAM:*:SOUR:_QUAL' => new EmptyElement(I18N::translate('Quality of completed citation')), + 'FAM:*:SOUR:_QUAL:_SOUR' => new HeredisQualSour(I18N::translate('Quality of the source')), + 'FAM:*:SOUR:_QUAL:_INFO' => new HeredisQualInfo(I18N::translate('Quality of the information')), + 'FAM:*:SOUR:_QUAL:_EVID' => new HeredisQualEvid(I18N::translate('Quality of the evidence')), + 'FAM:*:_FNA' => new HeredisFNA(I18N::translate('Research status')), + 'FAM:*:_RECH' => new EmptyElement(I18N::translate('Research data')), + 'FAM:*:_RECH:_PROJ' => new CustomElement(I18N::translate('Research project')), + 'FAM:*:_RECH:TYPE' => new CustomElement(I18N::translate('Document')), + 'FAM:*:_RECH:PLAC' => new PlaceName(I18N::translate('Search place')), + 'FAM:*:_RECH:DATE' => new DateValueExact(I18N::translate('Search date')), + 'FAM:*:_RECH:REFN' => new UserReferenceNumber(I18N::translate('Call number')), + 'FAM:*:_RECH:WWW' => new AddressWebPage(I18N::translate('URL')), + 'FAM:*:_RECH:NOTE' => new NoteStructure(I18N::translate('Note')), + 'INDI:_CLS' => new CustomBooleanFact(I18N::translate('Childless')), 'INDI:_CREA' => new Creation(I18N::translate('Created at')), - 'INDI:SIGN' => new CustomElement(I18N::translate('Signature')), + 'INDI:_FIL' => new HeredisFIL(I18N::translate('Child status')), + 'INDI:_ETI' => new CustomElement(I18N::translate('Personalized flag')), + 'INDI:_FNF' => new CustomBooleanFact(I18N::translate('Untraceable father')), + 'INDI:_MNF' => new CustomBooleanFact(I18N::translate('Untraceable mother')), + 'INDI:_SEC' => new CustomBooleanFact(I18N::translate('Secondary person')), + 'INDI:_ULS' => new CustomBooleanFact(I18N::translate('Unmarried')), + 'INDI:SIGN' => new CustomBooleanFact(I18N::translate('Signature')), + 'INDI:ASSO:_AGE' => new AgeAtEvent(I18N::translate('Age')), + 'INDI:ASSO:_ROLE' => new RoleInEvent(I18N::translate('Role')), + 'INDI:ASSO:_TITL' => new CustomElement(I18N::translate('Title')), + 'INDI:ASSO:_TYPE' => new CustomElement(I18N::translate('Type')), + 'INDI:HEAL' => new CustomElement(I18N::translate('Health')), + 'INDI:PAGE' => new CustomElement(I18N::translate('Reference number')), + 'INDI:*:DATE:_TIME' => new TimeValue(I18N::translate('Time')), + 'INDI:*:PLAC:_SUBMAP' => new Coordinates(I18N::translate('Geolocation of subdivisions')), + 'INDI:*:PLAC:_SUBMAP:LATI' => new PlaceLatitude(I18N::translate('Latitude of subdivision')), + 'INDI:*:PLAC:_SUBMAP:LONG' => new PlaceLongtitude(I18N::translate('Longitude of subdivision')), + 'INDI:*:SOUR:_QUAL' => new EmptyElement(I18N::translate('Quality of completed citation')), + 'INDI:*:SOUR:_QUAL:_SOUR' => new HeredisQualSour(I18N::translate('Quality of the source')), + 'INDI:*:SOUR:_QUAL:_INFO' => new HeredisQualInfo(I18N::translate('Quality of the information')), + 'INDI:*:SOUR:_QUAL:_EVID' => new HeredisQualEvid(I18N::translate('Quality of proof')), + 'INDI:*:_ETI' => new CustomElement(I18N::translate('Personalized flag')), + 'INDI:*:_FNA' => new HeredisFNA(I18N::translate('Research status')), + 'INDI:*:_RECH' => new HeredisRechElement(I18N::translate('Research data')), + 'INDI:*:_RECH:_PROJ' => new CustomElement(I18N::translate('Research project')), + 'INDI:*:_RECH:TYPE' => new CustomElement(I18N::translate('Document')), + 'INDI:*:_RECH:PLAC' => new PlaceName(I18N::translate('Search place')), + 'INDI:*:_RECH:DATE' => new DateValueExact(I18N::translate('Search date')), + 'INDI:*:_RECH:REFN' => new SourceCallNumber(I18N::translate('Call number')), + 'INDI:*:_RECH:WWW' => new AddressWebPage(I18N::translate('URL')), + 'INDI:*:_RECH:NOTE' => new NoteStructure(I18N::translate('Note')), + 'NOTE:_CREA' => new Creation(I18N::translate('Created at')), + 'OBJE:_CREA' => new Creation(I18N::translate('Created at')), + 'REPO:_CREA' => new Creation(I18N::translate('Created at')), + 'SOUR:EMAIL' => new AddressEmail(I18N::translate('Email address')), 'SOUR:QUAY' => new CertaintyAssessment(I18N::translate('Quality of data')), 'SOUR:TYPE' => new CustomElement(I18N::translate('Type')), - /* Reported on the forum - but what do they mean? - 'INDI:_FIL' => new CustomElement(I18N::translate('???')), - 'INDI:*:_FNA' => new CustomElement(I18N::translate('???')), - 'INDI:????:????:_SUBMAP' => new EmptyElement(I18N::translate('Coordinates'), ['INDI' => '1:1', 'LONG' => '1:1']), - 'INDI:????:????:_SUBMAP:LATI' => new PlaceLatitude(I18N::translate('Latitude')), - 'INDI:????:????:_SUBMAP:LONG' => new PlaceLongtitude(I18N::translate('Longitude')), - */ + 'SOUR:_ARCH' => new CustomElement(I18N::translate('Archive')), + 'SOUR:_CREA' => new Creation(I18N::translate('Created at')), ]; } } diff --git a/app/Elements/CustomBooleanFact.php b/app/Elements/CustomBooleanFact.php new file mode 100644 index 0000000000..42d2012d86 --- /dev/null +++ b/app/Elements/CustomBooleanFact.php @@ -0,0 +1,61 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use Fisharebest\Webtrees\I18N; + +/** + * CustomBooleanFact, leniently accepting values yes and no, true and false, 1 and 0, in uppercase or lowercase. + */ +class CustomBooleanFact extends AbstractEventElement +{ + /** + * Convert a value to a canonical form. + * + * @param string $value + * + * @return string + */ + public function canonical(string $value): string + { + $value = strtoupper(parent::canonical($value)); + if (in_array($value, ['YES', 'TRUE', '1'])) { + return 'Y'; + } + if (in_array($value, ['NO', 'FALSE', '0'])) { + return 'N'; + } + + return $value; + } + + /** + * A list of controlled values for this element + * + * @return array + */ + public function values(): array + { + return [ + 'Y' => I18N::translate('yes'), + 'N' => I18N::translate('no'), + ]; + } +} diff --git a/app/Elements/Graduation.php b/app/Elements/Graduation.php index 4cab06311e..bbae5c29d5 100644 --- a/app/Elements/Graduation.php +++ b/app/Elements/Graduation.php @@ -25,7 +25,7 @@ class Graduation extends AbstractEventElement { protected const array SUBTAGS = [ - 'TYPE' => '0:1:?', + 'TYPE' => '0:1', 'DATE' => '0:1', 'AGE' => '0:1', 'PLAC' => '0:1', diff --git a/app/Elements/HeredisFIL.php b/app/Elements/HeredisFIL.php new file mode 100644 index 0000000000..388a3de306 --- /dev/null +++ b/app/Elements/HeredisFIL.php @@ -0,0 +1,48 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use Fisharebest\Webtrees\I18N; + +/** + * Heredis custom tag INDI:_FIL - Child status + */ +class HeredisFIL extends AbstractElement +{ + /** + * A list of controlled values for this element + * + * @return array + */ + public function values(): array + { + return [ + 'LEGITIMATE_CHILD' => I18N::translate('Legitimate'), + 'NATURAL_CHILD' => I18N::translate('Natural'), + 'RECOGNIZED_CHILD' => I18N::translate('Legally recognised'), + 'LEGITIMIZED_CHILD' => I18N::translate('Legitimated'), + 'CHILD_FOUND' => I18N::translate('Foundling'), + 'ADOPTED_CHILD' => I18N::translateContext('Pedigree', 'Adopted'), + 'ADULTEROUS_CHILD' => I18N::translate('Illegitimate'), + 'STILLBORN_CHILD' => I18N::translate('stillborn'), + 'RELATIONSHIP_UNKNOW' => I18N::translate('Unknown'), + ]; + } +} diff --git a/app/Elements/HeredisFNA.php b/app/Elements/HeredisFNA.php new file mode 100644 index 0000000000..cb38fd3ed5 --- /dev/null +++ b/app/Elements/HeredisFNA.php @@ -0,0 +1,43 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use Fisharebest\Webtrees\I18N; + +/** + * Heredis custom tag INDI:*:_FNA - Research status + */ +class HeredisFNA extends AbstractElement +{ + /** + * A list of controlled values for this element + * + * @return array + */ + public function values(): array + { + return [ + 'NO' => I18N::translate('No search record'), + 'YES' => I18N::translate('Search record'), + 'NOT_FOUND' => I18N::translate('Untraceable record'), + 'IN_PROGRESS' => I18N::translate('Search in progress'), + ]; + } +} diff --git a/app/Elements/HeredisQualEvid.php b/app/Elements/HeredisQualEvid.php new file mode 100644 index 0000000000..b9ced963fc --- /dev/null +++ b/app/Elements/HeredisQualEvid.php @@ -0,0 +1,42 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use Fisharebest\Webtrees\I18N; + +/** + * Heredis custom tag *:*:SOUR:_QUAL:_EVID - quality of the evidence + */ +class HeredisQualEvid extends AbstractElement +{ + /** + * A list of controlled values for this element + * + * @return array + */ + public function values(): array + { + return [ + 'D' => I18N::translate('Direct'), + 'I' => I18N::translate('Indirect'), + 'N' => I18N::translate('Negative'), + ]; + } +} diff --git a/app/Elements/HeredisQualInfo.php b/app/Elements/HeredisQualInfo.php new file mode 100644 index 0000000000..3c38028bb6 --- /dev/null +++ b/app/Elements/HeredisQualInfo.php @@ -0,0 +1,41 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use Fisharebest\Webtrees\I18N; + +/** + * Heredis custom tag *:*:SOUR:_QUAL:_INFO - quality of the information + */ +class HeredisQualInfo extends AbstractElement +{ + /** + * A list of controlled values for this element + * + * @return array + */ + public function values(): array + { + return [ + 'P' => I18N::translate('Primary'), + 'S' => I18N::translate('Secondary'), + ]; + } +} diff --git a/app/Elements/HeredisQualSour.php b/app/Elements/HeredisQualSour.php new file mode 100644 index 0000000000..64a3f6b061 --- /dev/null +++ b/app/Elements/HeredisQualSour.php @@ -0,0 +1,41 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use Fisharebest\Webtrees\I18N; + +/** + * Heredis custom tag *:*:SOUR:_QUAL:_SOUR - quality of the source + */ +class HeredisQualSour extends AbstractElement +{ + /** + * A list of controlled values for this element + * + * @return array + */ + public function values(): array + { + return [ + 'O' => I18N::translate('Original'), + 'D' => I18N::translate('Derived'), + ]; + } +} diff --git a/app/Elements/HeredisRechElement.php b/app/Elements/HeredisRechElement.php new file mode 100644 index 0000000000..6484a47394 --- /dev/null +++ b/app/Elements/HeredisRechElement.php @@ -0,0 +1,47 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +/** + * Heredis custom tag *:*:_RECH - Research data of an event. + */ +class HeredisRechElement extends EmptyElement +{ + protected const array SUBTAGS = [ + '_PROJ' => '0:1', + 'TYPE' => '0:1', + 'PLAC' => '0:1', + 'DATE' => '0:1', + 'REFN' => '0:1', + 'WWW' => '0:1', + 'NOTE' => '0:1', + ]; + + /** + * Should we collapse the children of this element when editing? + * FIXME: label is not shown, it does not have a control to collapse + * + * @return bool + */ + public function collapseChildren(): bool + { + return true; + } +} diff --git a/app/Elements/HeredisUST.php b/app/Elements/HeredisUST.php new file mode 100644 index 0000000000..9fefdee142 --- /dev/null +++ b/app/Elements/HeredisUST.php @@ -0,0 +1,47 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use Fisharebest\Webtrees\I18N; + +/** + * Heredis custom tag FAM:_UST - Union status + */ +class HeredisUST extends AbstractElement +{ + /** + * A list of controlled values for this element + * + * @return array + */ + public function values(): array + { + return [ + 'MARRIED' => I18N::translateContext('FAM:_UST','Marriage'), + 'ENGAGEMENT' => I18N::translate('Engaged'), + 'SEPARATED' => I18N::translateContext('FAM:_UST','Separation'), + 'DIVORCED' => I18N::translate('Divorce'), + 'COMMON_LAW' => I18N::translate('Other type of marriage'), + 'COHABITATION' => I18N::translate('Cohabitee'), + 'UNKNOWN' => I18N::translate('Unknown family status'), + 'OTHER' => I18N::translate('Other status'), + ]; + } +} diff --git a/app/Module/IndividualFactsTabModule.php b/app/Module/IndividualFactsTabModule.php index ee28942858..1bd2541ac6 100644 --- a/app/Module/IndividualFactsTabModule.php +++ b/app/Module/IndividualFactsTabModule.php @@ -115,7 +115,7 @@ public function getTabContent(Individual $individual): string ->flatten(); // Don't show family meta-data tags - $exclude_facts = new Collection(['FAM:CHAN', 'FAM:_UID', 'FAM:UID', 'FAM:SUBM']); + $exclude_facts = new Collection(['FAM:CHAN', 'FAM:_UID', 'FAM:UID', 'FAM:SUBM', 'FAM:_CREA']); // Don't show tags that are shown in tabs or sidebars $exclude_facts = $exclude_facts->merge($sidebar_facts)->merge($tab_facts); diff --git a/app/Module/IndividualMetadataModule.php b/app/Module/IndividualMetadataModule.php index 97e8d334f6..6cf20f4898 100644 --- a/app/Module/IndividualMetadataModule.php +++ b/app/Module/IndividualMetadataModule.php @@ -41,14 +41,24 @@ class IndividualMetadataModule extends AbstractModule implements ModuleSidebarIn 'CHAN', 'DESI', 'IDNO', + 'PAGE', 'REFN', 'RESN', 'RFN', 'RIN', + 'SIGN', 'SSN', 'SUBM', - '_UID', + '_CLS', + '_CREA', + '_ETI', + '_FIL', '_FSFTID', + '_FNF', + '_MNF', + '_SEC', + '_UID', + '_ULS', '_WEBTAG', ]; diff --git a/resources/views/fact-date.phtml b/resources/views/fact-date.phtml index 4ef1ab8d71..512648997c 100644 --- a/resources/views/fact-date.phtml +++ b/resources/views/fact-date.phtml @@ -49,7 +49,7 @@ if (preg_match('/\n2 DATE (.+)/', $factrec, $match) === 1) { $date = new Date($match[1]); $html .= ' ' . $date->display($cal_link ? $record->tree() : null, null, true); // Time isn't valid GEDCOM, but it is widely used. - if ($time && preg_match('/\n3 TIME (.+)/', $factrec, $match) === 1) { + if ($time && preg_match('/\n3 [_]?TIME (.+)/', $factrec, $match) === 1) { $html .= ' – ' . $match[1] . ''; } diff --git a/tests/app/CustomTags/HeredisTest.php b/tests/app/CustomTags/HeredisTest.php index 87c2ee8f6c..a078af7ead 100644 --- a/tests/app/CustomTags/HeredisTest.php +++ b/tests/app/CustomTags/HeredisTest.php @@ -29,4 +29,12 @@ public function testClass(): void { self::assertTrue(class_exists(Heredis::class)); } + + public function testHeredis(): void + { + $heredis = new Heredis(); + self::assertSame('Heredis', $heredis->name()); + self::assertArrayHasKey('HEAD:_GUID', $heredis->tags()); + self::assertArrayHasKey('SOUR:_CREA', $heredis->tags()); + } } diff --git a/tests/app/Elements/CustomBooleanFactTest.php b/tests/app/Elements/CustomBooleanFactTest.php new file mode 100644 index 0000000000..c6d149116e --- /dev/null +++ b/tests/app/Elements/CustomBooleanFactTest.php @@ -0,0 +1,41 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use PHPUnit\Framework\Attributes\CoversClass; + +#[CoversClass(AbstractElement::class)] +#[CoversClass(CustomBooleanFact::class)] +class CustomBooleanFactTest extends AbstractElementTestCase +{ + public function setUp(): void + { + parent::setUp(); + + self::$element = new CustomBooleanFact('label'); + } + + public function testCanonical(): void + { + self::assertSame('Y', self::$element->canonical(' y ')); + self::assertSame('Y', self::$element->canonical('YES')); + self::assertSame('N', self::$element->canonical('NO')); + } +} diff --git a/tests/app/Elements/HeredisFILTest.php b/tests/app/Elements/HeredisFILTest.php new file mode 100644 index 0000000000..ed804aff4c --- /dev/null +++ b/tests/app/Elements/HeredisFILTest.php @@ -0,0 +1,39 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use PHPUnit\Framework\Attributes\CoversClass; + +#[CoversClass(AbstractElement::class)] +#[CoversClass(HeredisFIL::class)] +class HeredisFILTest extends AbstractElementTestCase +{ + public function setUp(): void + { + parent::setUp(); + + self::$element = new HeredisFIL('label'); + } + + public function testValues(): void + { + self::assertArrayHasKey('RECOGNIZED_CHILD', self::$element->values()); + } +} diff --git a/tests/app/Elements/HeredisFNATest.php b/tests/app/Elements/HeredisFNATest.php new file mode 100644 index 0000000000..6d5f0000a3 --- /dev/null +++ b/tests/app/Elements/HeredisFNATest.php @@ -0,0 +1,39 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use PHPUnit\Framework\Attributes\CoversClass; + +#[CoversClass(AbstractElement::class)] +#[CoversClass(HeredisFNA::class)] +class HeredisFNATest extends AbstractElementTestCase +{ + public function setUp(): void + { + parent::setUp(); + + self::$element = new HeredisFNA('label'); + } + + public function testValues(): void + { + self::assertArrayHasKey('IN_PROGRESS', self::$element->values()); + } +} diff --git a/tests/app/Elements/HeredisQualEvidTest.php b/tests/app/Elements/HeredisQualEvidTest.php new file mode 100644 index 0000000000..3f2c6b3a50 --- /dev/null +++ b/tests/app/Elements/HeredisQualEvidTest.php @@ -0,0 +1,39 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use PHPUnit\Framework\Attributes\CoversClass; + +#[CoversClass(AbstractElement::class)] +#[CoversClass(HeredisQualEvid::class)] +class HeredisQualEvidTest extends AbstractElementTestCase +{ + public function setUp(): void + { + parent::setUp(); + + self::$element = new HeredisQualEvid('label'); + } + + public function testValues(): void + { + self::assertArrayHasKey('N', self::$element->values()); + } +} diff --git a/tests/app/Elements/HeredisQualInfoTest.php b/tests/app/Elements/HeredisQualInfoTest.php new file mode 100644 index 0000000000..b14f56193b --- /dev/null +++ b/tests/app/Elements/HeredisQualInfoTest.php @@ -0,0 +1,39 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use PHPUnit\Framework\Attributes\CoversClass; + +#[CoversClass(AbstractElement::class)] +#[CoversClass(HeredisQualInfo::class)] +class HeredisQualInfoTest extends AbstractElementTestCase +{ + public function setUp(): void + { + parent::setUp(); + + self::$element = new HeredisQualInfo('label'); + } + + public function testValues(): void + { + self::assertArrayHasKey('S', self::$element->values()); + } +} diff --git a/tests/app/Elements/HeredisQualSourTest.php b/tests/app/Elements/HeredisQualSourTest.php new file mode 100644 index 0000000000..857726c92b --- /dev/null +++ b/tests/app/Elements/HeredisQualSourTest.php @@ -0,0 +1,39 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use PHPUnit\Framework\Attributes\CoversClass; + +#[CoversClass(AbstractElement::class)] +#[CoversClass(HeredisQualSour::class)] +class HeredisQualSourTest extends AbstractElementTestCase +{ + public function setUp(): void + { + parent::setUp(); + + self::$element = new HeredisQualSour('label'); + } + + public function testValues(): void + { + self::assertArrayHasKey('D', self::$element->values()); + } +} diff --git a/tests/app/Elements/HeredisRechElementTest.php b/tests/app/Elements/HeredisRechElementTest.php new file mode 100644 index 0000000000..f8d813b4ec --- /dev/null +++ b/tests/app/Elements/HeredisRechElementTest.php @@ -0,0 +1,39 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use PHPUnit\Framework\Attributes\CoversClass; + +#[CoversClass(AbstractElement::class)] +#[CoversClass(HeredisRechElement::class)] +class HeredisRechElementTest extends AbstractElementTestCase +{ + public function setUp(): void + { + parent::setUp(); + + self::$element = new HeredisRechElement('label'); + } + + public function testCollapse(): void + { + self::assertTrue(self::$element->collapseChildren()); + } +} diff --git a/tests/app/Elements/HeredisUSTTest.php b/tests/app/Elements/HeredisUSTTest.php new file mode 100644 index 0000000000..b8e1cc0f18 --- /dev/null +++ b/tests/app/Elements/HeredisUSTTest.php @@ -0,0 +1,39 @@ +. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Elements; + +use PHPUnit\Framework\Attributes\CoversClass; + +#[CoversClass(AbstractElement::class)] +#[CoversClass(HeredisUST::class)] +class HeredisUSTTest extends AbstractElementTestCase +{ + public function setUp(): void + { + parent::setUp(); + + self::$element = new HeredisUST('label'); + } + + public function testValues(): void + { + self::assertArrayHasKey('MARRIED', self::$element->values()); + } +}