xref: /webtrees/tests/app/TreeTest.php (revision 6b9cb339562c8aa4681c7eff2bf3bdf401cc9edd)
1a25f0a04SGreg Roach<?php
23976b470SGreg Roach
3a25f0a04SGreg Roach/**
4a25f0a04SGreg Roach * webtrees: online genealogy
58fcd0d32SGreg Roach * Copyright (C) 2019 webtrees development team
6a25f0a04SGreg Roach * This program is free software: you can redistribute it and/or modify
7a25f0a04SGreg Roach * it under the terms of the GNU General Public License as published by
8a25f0a04SGreg Roach * the Free Software Foundation, either version 3 of the License, or
9a25f0a04SGreg Roach * (at your option) any later version.
10a25f0a04SGreg Roach * This program is distributed in the hope that it will be useful,
11a25f0a04SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
12a25f0a04SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13a25f0a04SGreg Roach * GNU General Public License for more details.
14a25f0a04SGreg Roach * You should have received a copy of the GNU General Public License
15a25f0a04SGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>.
16a25f0a04SGreg Roach */
17fcfa147eSGreg Roach
18e7f56f2aSGreg Roachdeclare(strict_types=1);
19e7f56f2aSGreg Roach
2084e2cf4eSGreg Roachnamespace Fisharebest\Webtrees;
21a25f0a04SGreg Roach
2269675509SGreg Roachuse Fisharebest\Webtrees\Contracts\CacheFactoryInterface;
235afbc57aSGreg Roachuse Fisharebest\Webtrees\Functions\FunctionsImport;
2469c05a6eSGreg Roachuse Fisharebest\Webtrees\Services\GedcomExportService;
255afbc57aSGreg Roachuse Fisharebest\Webtrees\Services\TreeService;
26e5a6b4d4SGreg Roachuse Fisharebest\Webtrees\Services\UserService;
273cfcc809SGreg Roachuse InvalidArgumentException;
2869675509SGreg Roachuse Symfony\Component\Cache\Adapter\NullAdapter;
293976b470SGreg Roach
3094026f20SGreg Roachuse function stream_get_contents;
3194026f20SGreg Roach
32a25f0a04SGreg Roach/**
33a25f0a04SGreg Roach * Test harness for the class Tree
34a25f0a04SGreg Roach */
35e5a6b4d4SGreg Roachclass TreeTest extends TestCase
36c1010edaSGreg Roach{
37126654d7SGreg Roach    protected static $uses_database = true;
38126654d7SGreg Roach
3969675509SGreg Roach    public function setUp(): void
4069675509SGreg Roach    {
4169675509SGreg Roach        parent::setUp();
4269675509SGreg Roach
4369675509SGreg Roach        $cache_factory = $this->createMock(CacheFactoryInterface::class);
4469675509SGreg Roach        $cache_factory->method('array')->willReturn(new Cache(new NullAdapter()));
45*6b9cb339SGreg Roach        Registry::cache($cache_factory);
4669675509SGreg Roach    }
4769675509SGreg Roach
48a25f0a04SGreg Roach    /**
49126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::__construct
50126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::id
51126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::name
52126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::title
5352348eb8SGreg Roach     * @return void
54a25f0a04SGreg Roach     */
55126654d7SGreg Roach    public function testConstructor(): void
56c1010edaSGreg Roach    {
571e653452SGreg Roach        $tree_service = new TreeService();
581e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
59126654d7SGreg Roach
601e653452SGreg Roach        $this->assertSame('name', $tree->name());
611e653452SGreg Roach        $this->assertSame('title', $tree->title());
62126654d7SGreg Roach    }
63126654d7SGreg Roach
64126654d7SGreg Roach    /**
65126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::getPreference
66126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::setPreference
67126654d7SGreg Roach     * @return void
68126654d7SGreg Roach     */
69af343084SGreg Roach    public function testTreePreferences(): void
70126654d7SGreg Roach    {
711e653452SGreg Roach        $tree_service = new TreeService();
721e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
73126654d7SGreg Roach
74126654d7SGreg Roach        $pref = $tree->getPreference('foo', 'default');
75126654d7SGreg Roach        $this->assertSame('default', $pref);
76126654d7SGreg Roach
77126654d7SGreg Roach        $tree->setPreference('foo', 'bar');
78126654d7SGreg Roach        $pref = $tree->getPreference('foo', 'default');
79126654d7SGreg Roach        $this->assertSame('bar', $pref);
80a25f0a04SGreg Roach    }
81af343084SGreg Roach
82af343084SGreg Roach    /**
83af343084SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::getUserPreference
84000dd58cSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::setUserPreference
85af343084SGreg Roach     * @return void
86af343084SGreg Roach     */
87af343084SGreg Roach    public function testUserTreePreferences(): void
88af343084SGreg Roach    {
89e5a6b4d4SGreg Roach        $user_service = new UserService();
901e653452SGreg Roach        $tree_service = new TreeService();
911e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
92e5a6b4d4SGreg Roach        $user         = $user_service->create('user', 'User', 'user@example.com', 'secret');
93af343084SGreg Roach
94af343084SGreg Roach        $pref = $tree->getUserPreference($user, 'foo', 'default');
95af343084SGreg Roach        $this->assertSame('default', $pref);
96af343084SGreg Roach
97af343084SGreg Roach        $tree->setUserPreference($user, 'foo', 'bar');
98af343084SGreg Roach        $pref = $tree->getUserPreference($user, 'foo', 'default');
99af343084SGreg Roach        $this->assertSame('bar', $pref);
100af343084SGreg Roach    }
101963fbaeeSGreg Roach
102963fbaeeSGreg Roach    /**
1037d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::getNewXref
1047d76853dSGreg Roach     * @return void
1057d76853dSGreg Roach     */
1067d76853dSGreg Roach    public function testGetNewXref(): void
1077d76853dSGreg Roach    {
1085afbc57aSGreg Roach        $tree_service = new TreeService();
1095afbc57aSGreg Roach        $tree         = $tree_service->create('tree-name', 'Tree title');
1107d76853dSGreg Roach
1115afbc57aSGreg Roach        // New trees have an individual X1.
1127d76853dSGreg Roach        $this->assertSame('X2', $tree->getNewXref());
1137d76853dSGreg Roach        $this->assertSame('X3', $tree->getNewXref());
1147d76853dSGreg Roach        $this->assertSame('X4', $tree->getNewXref());
1157d76853dSGreg Roach        $this->assertSame('X5', $tree->getNewXref());
1167d76853dSGreg Roach    }
1177d76853dSGreg Roach
1187d76853dSGreg Roach    /**
1197d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createIndividual
1207d76853dSGreg Roach     * @return void
1217d76853dSGreg Roach     */
1227d76853dSGreg Roach    public function testCreateInvalidIndividual(): void
1237d76853dSGreg Roach    {
1243cfcc809SGreg Roach        $this->expectException(InvalidArgumentException::class);
1253cfcc809SGreg Roach
126e5a6b4d4SGreg Roach        $user_service = new UserService();
1271e653452SGreg Roach        $tree_service = new TreeService();
1281e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
129e5a6b4d4SGreg Roach        $user         = $user_service->create('user', 'User', 'user@example.com', 'secret');
1307c4add84SGreg Roach        $user->setPreference(User::PREF_IS_ADMINISTRATOR, '1');
1317d76853dSGreg Roach        Auth::login($user);
1327d76853dSGreg Roach
1337d76853dSGreg Roach        $tree->createIndividual("0 @@ FOO\n1 SEX U");
1347d76853dSGreg Roach    }
1357d76853dSGreg Roach
1367d76853dSGreg Roach    /**
137963fbaeeSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createIndividual
138963fbaeeSGreg Roach     * @return void
139963fbaeeSGreg Roach     */
140963fbaeeSGreg Roach    public function testCreateIndividual(): void
141963fbaeeSGreg Roach    {
142e5a6b4d4SGreg Roach        $user_service = new UserService();
1431e653452SGreg Roach        $tree_service = new TreeService();
1441e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
145e5a6b4d4SGreg Roach        $user         = $user_service->create('user', 'User', 'user@example.com', 'secret');
1467c4add84SGreg Roach        $user->setPreference(User::PREF_IS_ADMINISTRATOR, '1');
147963fbaeeSGreg Roach        Auth::login($user);
148963fbaeeSGreg Roach
1498f9b0fb2SGreg Roach        $record = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
1508f9b0fb2SGreg Roach        $this->assertTrue($record->isPendingAddition());
151963fbaeeSGreg Roach
1527c4add84SGreg Roach        $user->setPreference(User::PREF_AUTO_ACCEPT_EDITS, '1');
1538f9b0fb2SGreg Roach        $record = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
1548f9b0fb2SGreg Roach        $this->assertFalse($record->isPendingAddition());
1558f9b0fb2SGreg Roach    }
156963fbaeeSGreg Roach
1578f9b0fb2SGreg Roach    /**
1587d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createFamily
1598f9b0fb2SGreg Roach     * @return void
1608f9b0fb2SGreg Roach     */
1617d76853dSGreg Roach    public function testCreateInvalidFamily(): void
1628f9b0fb2SGreg Roach    {
1633cfcc809SGreg Roach        $this->expectException(InvalidArgumentException::class);
1643cfcc809SGreg Roach
165e5a6b4d4SGreg Roach        $user_service = new UserService();
1661e653452SGreg Roach        $tree_service = new TreeService();
1671e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
168e5a6b4d4SGreg Roach        $user         = $user_service->create('user', 'User', 'user@example.com', 'secret');
1697c4add84SGreg Roach        $user->setPreference(User::PREF_IS_ADMINISTRATOR, '1');
1707d76853dSGreg Roach        Auth::login($user);
171963fbaeeSGreg Roach
1727d76853dSGreg Roach        $tree->createFamily("0 @@ FOO\n1 MARR Y");
1738f9b0fb2SGreg Roach    }
174963fbaeeSGreg Roach
1758f9b0fb2SGreg Roach    /**
1768f9b0fb2SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createFamily
1778f9b0fb2SGreg Roach     * @return void
1788f9b0fb2SGreg Roach     */
1798f9b0fb2SGreg Roach    public function testCreateFamily(): void
1808f9b0fb2SGreg Roach    {
181e5a6b4d4SGreg Roach        $user_service = new UserService();
1821e653452SGreg Roach        $tree_service = new TreeService();
1831e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
184e5a6b4d4SGreg Roach        $user         = $user_service->create('user', 'User', 'user@example.com', 'secret');
1857c4add84SGreg Roach        $user->setPreference(User::PREF_IS_ADMINISTRATOR, '1');
1868f9b0fb2SGreg Roach        Auth::login($user);
1878f9b0fb2SGreg Roach
1888f9b0fb2SGreg Roach        $record = $tree->createFamily("0 @@ FAM\n1 MARR Y");
1898f9b0fb2SGreg Roach        $this->assertTrue($record->isPendingAddition());
1908f9b0fb2SGreg Roach
1917c4add84SGreg Roach        $user->setPreference(User::PREF_AUTO_ACCEPT_EDITS, '1');
1928f9b0fb2SGreg Roach        $record = $tree->createFamily("0 @@ FAM\n1 MARR Y");
1938f9b0fb2SGreg Roach        $this->assertFalse($record->isPendingAddition());
1948f9b0fb2SGreg Roach    }
1958f9b0fb2SGreg Roach
1968f9b0fb2SGreg Roach    /**
1977d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createMediaObject
1987d76853dSGreg Roach     * @return void
1997d76853dSGreg Roach     */
2007d76853dSGreg Roach    public function testCreateInvalidMediaObject(): void
2017d76853dSGreg Roach    {
2023cfcc809SGreg Roach        $this->expectException(InvalidArgumentException::class);
2033cfcc809SGreg Roach
204e5a6b4d4SGreg Roach        $user_service = new UserService();
2051e653452SGreg Roach        $tree_service = new TreeService();
2061e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
207e5a6b4d4SGreg Roach        $user         = $user_service->create('user', 'User', 'user@example.com', 'secret');
2087c4add84SGreg Roach        $user->setPreference(User::PREF_IS_ADMINISTRATOR, '1');
2097d76853dSGreg Roach        Auth::login($user);
2107d76853dSGreg Roach
2117d76853dSGreg Roach        $tree->createMediaObject("0 @@ FOO\n1 MARR Y");
2127d76853dSGreg Roach    }
2137d76853dSGreg Roach
2147d76853dSGreg Roach    /**
2157d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createMediaObject
2167d76853dSGreg Roach     * @return void
2177d76853dSGreg Roach     */
2187d76853dSGreg Roach    public function testCreateMediaObject(): void
2197d76853dSGreg Roach    {
220e5a6b4d4SGreg Roach        $user_service = new UserService();
2211e653452SGreg Roach        $tree_service = new TreeService();
2221e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
223e5a6b4d4SGreg Roach        $user         = $user_service->create('user', 'User', 'user@example.com', 'secret');
2247c4add84SGreg Roach        $user->setPreference(User::PREF_IS_ADMINISTRATOR, '1');
2257d76853dSGreg Roach        Auth::login($user);
2267d76853dSGreg Roach
2277d76853dSGreg Roach        $record = $tree->createMediaObject("0 @@ OBJE\n1 FILE foo.jpeg");
2287d76853dSGreg Roach        $this->assertTrue($record->isPendingAddition());
2297d76853dSGreg Roach
2307c4add84SGreg Roach        $user->setPreference(User::PREF_AUTO_ACCEPT_EDITS, '1');
2317d76853dSGreg Roach        $record = $tree->createMediaObject("0 @@ OBJE\n1 FILE foo.jpeg");
2327d76853dSGreg Roach        $this->assertFalse($record->isPendingAddition());
2337d76853dSGreg Roach    }
2347d76853dSGreg Roach
2357d76853dSGreg Roach    /**
236bec87e94SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createRecord
237bec87e94SGreg Roach     * @return void
238bec87e94SGreg Roach     */
239bec87e94SGreg Roach    public function testCreateInvalidRecord(): void
240bec87e94SGreg Roach    {
2413cfcc809SGreg Roach        $this->expectException(InvalidArgumentException::class);
2423cfcc809SGreg Roach
243e5a6b4d4SGreg Roach        $user_service = new UserService();
2441e653452SGreg Roach        $tree_service = new TreeService();
2451e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
246e5a6b4d4SGreg Roach        $user         = $user_service->create('user', 'User', 'user@example.com', 'secret');
2477c4add84SGreg Roach        $user->setPreference(User::PREF_IS_ADMINISTRATOR, '1');
248bec87e94SGreg Roach        Auth::login($user);
249bec87e94SGreg Roach
250bec87e94SGreg Roach        $tree->createRecord("0 @@FOO\n1 NOTE noted");
251bec87e94SGreg Roach    }
252bec87e94SGreg Roach
253bec87e94SGreg Roach    /**
254bec87e94SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createRecord
255bec87e94SGreg Roach     * @return void
256bec87e94SGreg Roach     */
257bec87e94SGreg Roach    public function testCreateRecord(): void
258bec87e94SGreg Roach    {
259e5a6b4d4SGreg Roach        $user_service = new UserService();
2601e653452SGreg Roach        $tree_service = new TreeService();
2611e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
262e5a6b4d4SGreg Roach        $user         = $user_service->create('user', 'User', 'user@example.com', 'secret');
2637c4add84SGreg Roach        $user->setPreference(User::PREF_IS_ADMINISTRATOR, '1');
264bec87e94SGreg Roach        Auth::login($user);
265bec87e94SGreg Roach
266bec87e94SGreg Roach        $record = $tree->createRecord("0 @@ FOO\n1 NOTE noted");
267bec87e94SGreg Roach        $this->assertTrue($record->isPendingAddition());
268bec87e94SGreg Roach
2697c4add84SGreg Roach        $user->setPreference(User::PREF_AUTO_ACCEPT_EDITS, '1');
270bec87e94SGreg Roach        $record = $tree->createRecord("0 @@ FOO\n1 NOTE noted");
271bec87e94SGreg Roach        $this->assertFalse($record->isPendingAddition());
272bec87e94SGreg Roach    }
273bec87e94SGreg Roach
274bec87e94SGreg Roach    /**
2758f9b0fb2SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::significantIndividual
2768f9b0fb2SGreg Roach     * @return void
2778f9b0fb2SGreg Roach     */
2788f9b0fb2SGreg Roach    public function testSignificantIndividual(): void
2798f9b0fb2SGreg Roach    {
280e5a6b4d4SGreg Roach        $user_service = new UserService();
2811e653452SGreg Roach        $tree_service = new TreeService();
2821e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
283e5a6b4d4SGreg Roach        $user         = $user_service->create('user', 'User', 'user@example.com', 'secret');
2847c4add84SGreg Roach        $user->setPreference(User::PREF_AUTO_ACCEPT_EDITS, '1');
2858f9b0fb2SGreg Roach        Auth::login($user);
2868f9b0fb2SGreg Roach
2875afbc57aSGreg Roach        // Delete the tree's default individual.
2885afbc57aSGreg Roach        FunctionsImport::updateRecord('0 @X1@ INDI', $tree, true);
2895afbc57aSGreg Roach
2901f244d77SGreg Roach        // No individuals in tree?  Fake individual
2918f9b0fb2SGreg Roach        $this->assertSame('I', $tree->significantIndividual($user)->xref());
2928f9b0fb2SGreg Roach
2938f9b0fb2SGreg Roach        $record1 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
2948f9b0fb2SGreg Roach        $record2 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
2958f9b0fb2SGreg Roach        $record3 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
2968f9b0fb2SGreg Roach        $record4 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
2978f9b0fb2SGreg Roach
2988f9b0fb2SGreg Roach        // Individuals exist?  First one (lowest XREF).
2998f9b0fb2SGreg Roach        $this->assertSame($record1->xref(), $tree->significantIndividual($user)->xref());
3008f9b0fb2SGreg Roach
3018f9b0fb2SGreg Roach        // Preference for tree?
3028f9b0fb2SGreg Roach        $tree->setPreference('PEDIGREE_ROOT_ID', $record2->xref());
3038f9b0fb2SGreg Roach        $this->assertSame($record2->xref(), $tree->significantIndividual($user)->xref());
3048f9b0fb2SGreg Roach
3058f9b0fb2SGreg Roach        // User preference
3067c4add84SGreg Roach        $tree->setUserPreference($user, User::PREF_TREE_ACCOUNT_XREF, $record3->xref());
3078f9b0fb2SGreg Roach        $this->assertSame($record3->xref(), $tree->significantIndividual($user)->xref());
3088f9b0fb2SGreg Roach
3098f9b0fb2SGreg Roach        // User record
3107c4add84SGreg Roach        $tree->setUserPreference($user, User::PREF_TREE_DEFAULT_XREF, $record4->xref());
3118f9b0fb2SGreg Roach        $this->assertSame($record4->xref(), $tree->significantIndividual($user)->xref());
312963fbaeeSGreg Roach    }
313a7890280SGreg Roach
314a7890280SGreg Roach    /**
315a7890280SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::importGedcomFile
316a7890280SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::deleteGenealogyData
317a7890280SGreg Roach     * @return void
318a7890280SGreg Roach     */
319a7890280SGreg Roach    public function testImportAndDeleteGedcomFile(): void
320a7890280SGreg Roach    {
3215afbc57aSGreg Roach        $tree_service = new TreeService();
322a7890280SGreg Roach        $tree = $this->importTree('demo.ged');
3231e653452SGreg Roach        $this->assertNotNull($tree_service->all()->get('demo.ged'));
324432ff88aSGreg Roach        Site::setPreference('DEFAULT_GEDCOM', $tree->name());
325a7890280SGreg Roach
3265afbc57aSGreg Roach        $tree_service->delete($tree);
327432ff88aSGreg Roach
3281e653452SGreg Roach        $this->assertNull($tree_service->all()->get('demo.ged'));
329432ff88aSGreg Roach        $this->assertSame('', Site::getPreference('DEFAULT_GEDCOM'));
330a7890280SGreg Roach    }
33115a3f100SGreg Roach
33215a3f100SGreg Roach    /**
33315a3f100SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::hasPendingEdit
33415a3f100SGreg Roach     * @return void
33515a3f100SGreg Roach     */
33615a3f100SGreg Roach    public function testHasPendingEdits(): void
33715a3f100SGreg Roach    {
338e5a6b4d4SGreg Roach        $user_service = new UserService();
33915a3f100SGreg Roach        $tree         = $this->importTree('demo.ged');
340e5a6b4d4SGreg Roach        $user         = $user_service->create('admin', 'Administrator', 'admin@example.com', 'secret');
3417c4add84SGreg Roach        $user->setPreference(User::PREF_IS_ADMINISTRATOR, '1');
34215a3f100SGreg Roach        Auth::login($user);
34315a3f100SGreg Roach
3447c4add84SGreg Roach        $user->setPreference(User::PREF_AUTO_ACCEPT_EDITS, '1');
34515a3f100SGreg Roach        $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
34615a3f100SGreg Roach        $this->assertFalse($tree->hasPendingEdit());
34715a3f100SGreg Roach
3487c4add84SGreg Roach        $user->setPreference(User::PREF_AUTO_ACCEPT_EDITS, '');
34915a3f100SGreg Roach        $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
35015a3f100SGreg Roach        $this->assertTrue($tree->hasPendingEdit());
35115a3f100SGreg Roach    }
35294026f20SGreg Roach
35394026f20SGreg Roach    /**
35469c05a6eSGreg Roach     * @covers \Fisharebest\Webtrees\Services\GedcomExportService::export
35594026f20SGreg Roach     * @return void
35694026f20SGreg Roach     */
35794026f20SGreg Roach    public function testExportGedcom(): void
35894026f20SGreg Roach    {
35994026f20SGreg Roach        $tree = $this->importTree('demo.ged');
36094026f20SGreg Roach
361803193feSGreg Roach        $fp = fopen('php://memory', 'wb');
36294026f20SGreg Roach
36369c05a6eSGreg Roach        $gedcom_export_service = new GedcomExportService();
36469c05a6eSGreg Roach        $gedcom_export_service->export($tree, $fp, true);
36594026f20SGreg Roach
36694026f20SGreg Roach        rewind($fp);
36794026f20SGreg Roach
36894026f20SGreg Roach        $original = file_get_contents(__DIR__ . '/../data/demo.ged');
36994026f20SGreg Roach        $export   = stream_get_contents($fp);
37094026f20SGreg Roach
37169c05a6eSGreg Roach        // The version, date and time in the HEAD record will be different.
37269c05a6eSGreg Roach        $original = preg_replace('/\n2 VERS .*/', '', $original, 1);
37369c05a6eSGreg Roach        $export   = preg_replace('/\n2 VERS .*/', '', $export, 1);
37494026f20SGreg Roach        $original = preg_replace('/\n1 DATE .. ... ..../', '', $original, 1);
37594026f20SGreg Roach        $export   = preg_replace('/\n1 DATE .. ... ..../', '', $export, 1);
37694026f20SGreg Roach        $original = preg_replace('/\n2 TIME ..:..:../', '', $original, 1);
37794026f20SGreg Roach        $export   = preg_replace('/\n2 TIME ..:..:../', '', $export, 1);
37894026f20SGreg Roach
37994026f20SGreg Roach        $this->assertSame($original, $export);
38094026f20SGreg Roach    }
381a25f0a04SGreg Roach}
382