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