xref: /webtrees/tests/app/Services/GedcomEditServiceTest.php (revision d11be7027e34e3121be11cc025421873364403f9)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * Copyright (C) 2023 webtrees development team
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
18declare(strict_types=1);
19
20namespace Fisharebest\Webtrees\Services;
21
22use Fisharebest\Webtrees\TestCase;
23use Fisharebest\Webtrees\Tree;
24
25/**
26 * Test harness for the class GedcomEditService
27 *
28 * @covers \Fisharebest\Webtrees\Services\GedcomEditService
29 */
30class GedcomEditServiceTest extends TestCase
31{
32    protected static bool $uses_database = true;
33
34    /**
35     * @covers \Fisharebest\Webtrees\Services\GedcomEditService::editLinesToGedcom
36     */
37    public function testEditLinesToGedcom(): void
38    {
39        $gedcom_edit_service = new GedcomEditService();
40
41        static::assertSame(
42            '1 BIRT Y',
43            $gedcom_edit_service->editLinesToGedcom(
44                'INDI',
45                ['1'],
46                ['BIRT'],
47                ['Y'],
48                false
49            )
50        );
51
52        static::assertSame(
53            "\n1 BIRT Y\n2 ADDR England",
54            $gedcom_edit_service->editLinesToGedcom(
55                'INDI',
56                ['1', '2'],
57                ['BIRT', 'ADDR'],
58                ['Y', 'England']
59            )
60        );
61
62        static::assertSame(
63            "\n1 BIRT\n2 PLAC England",
64            $gedcom_edit_service->editLinesToGedcom(
65                'INDI',
66                ['1', '2'],
67                ['BIRT', 'PLAC'],
68                ['Y', 'England']
69            )
70        );
71
72        static::assertSame(
73            "\n1 BIRT\n2 PLAC England\n2 SOUR @S1@\n3 PAGE 123",
74            $gedcom_edit_service->editLinesToGedcom(
75                'INDI',
76                ['1', '2', '2', '3'],
77                ['BIRT', 'PLAC', 'SOUR', 'PAGE'],
78                ['Y', 'England', '@S1@', '123']
79            )
80        );
81
82        // Missing SOUR, so ignore PAGE
83        static::assertSame(
84            "\n1 BIRT\n2 PLAC England",
85            $gedcom_edit_service->editLinesToGedcom(
86                'INDI',
87                ['1', '2', '2', '3'],
88                ['BIRT', 'PLAC', 'SOUR', 'PAGE'],
89                ['Y', 'England', '', '123']
90            )
91        );
92
93        static::assertSame(
94            "\n1 BIRT\n2 PLAC England",
95            $gedcom_edit_service->editLinesToGedcom(
96                'INDI',
97                ['1', '2', '2', '3'],
98                ['BIRT', 'PLAC', 'SOUR', 'PAGE'],
99                ['Y', 'England', '', '123']
100            )
101        );
102
103        static::assertSame(
104            "\n1 BIRT\n2 PLAC England\n1 DEAT\n2 PLAC Scotland",
105            $gedcom_edit_service->editLinesToGedcom(
106                'INDI',
107                ['1', '2', '2', '3', '1', '2', '2', '3'],
108                ['BIRT', 'PLAC', 'SOUR', 'PAGE', 'DEAT', 'PLAC', 'SOUR', 'PAGE'],
109                ['Y', 'England', '', '123', 'Y', 'Scotland', '', '123']
110            )
111        );
112    }
113
114    /**
115     * @dataProvider newFamilyFactsData
116     *
117     * @param string $required_famfacts
118     * @param array<string> $expected_new_facts
119     */
120    public function testNewFamilyFacts(string $required_famfacts, array $expected_new_facts): void
121    {
122        $gedcom_edit_service = new GedcomEditService();
123
124        $tree = $this->createMock(Tree::class);
125        $tree->method('getPreference')->with('QUICK_REQUIRED_FAMFACTS')->willReturn($required_famfacts);
126
127        $new_facts = $gedcom_edit_service->newFamilyFacts($tree);
128        self::assertSameSize($expected_new_facts, $new_facts);
129        for ($i = 0; $i < count($expected_new_facts); $i++) {
130            $new_fact = $new_facts->get($i);
131            self::assertSame($expected_new_facts[$i], $new_fact->tag());
132        }
133    }
134
135    /**
136     * @dataProvider newIndividualFactsData
137     *
138     * @param string $required_facts
139     * @param string $sex
140     * @param array<string> $names
141     * @param array<string> $expected_new_facts
142     */
143    public function testNewIndividualFactsWithNoFacts(
144        string $required_facts,
145        string $sex,
146        array $names,
147        array $expected_new_facts
148    ): void {
149        $gedcom_edit_service = new GedcomEditService();
150
151        $tree = $this->createMock(Tree::class);
152        $tree->method('getPreference')->with('QUICK_REQUIRED_FACTS')->willReturn($required_facts);
153
154        $new_facts = $gedcom_edit_service->newIndividualFacts($tree, $sex, $names);
155        self::assertSameSize($expected_new_facts, $new_facts);
156        for ($i = 0; $i < count($expected_new_facts); $i++) {
157            $new_fact = $new_facts->get($i);
158            self::assertSame($expected_new_facts[$i], $new_fact->tag());
159        }
160    }
161
162    /**
163     * Data provider for new family facts tests
164     * @return array<array<string|array<string>>>
165     */
166    public function newFamilyFactsData(): array
167    {
168        return [
169            ['', []],
170            ['MARR', ['FAM:MARR']],
171            ['FOOTAG', ['FAM:FOOTAG']],
172            ['MARR,DIV', ['FAM:MARR', 'FAM:DIV']],
173        ];
174    }
175
176    /**
177     * Data provider for new inidvidual facts tests
178     * @return array<array<string|array<string>>>
179     */
180    public function newIndividualFactsData(): array
181    {
182        return [
183            ['', 'F', ['1 NAME FOONAME'], ['INDI:SEX', 'INDI:NAME']],
184            ['BIRT', 'F', ['1 NAME FOONAME'], ['INDI:SEX', 'INDI:NAME', 'INDI:BIRT']],
185            ['FOOTAG', 'F', ['1 NAME FOONAME'], ['INDI:SEX', 'INDI:NAME', 'INDI:FOOTAG']],
186            ['BIRT,DEAT', 'F', ['1 NAME FOONAME'], ['INDI:SEX', 'INDI:NAME', 'INDI:BIRT', 'INDI:DEAT']],
187        ];
188    }
189}
190