4
0

I18nDataTest.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. <?php
  2. declare(strict_types=1);
  3. require_once __DIR__ . '/../../../cli/i18n/I18nData.php';
  4. require_once __DIR__ . '/../../../cli/i18n/I18nValue.php';
  5. class I18nDataTest extends PHPUnit\Framework\TestCase {
  6. /** @var array<string,array<string,array<string,I18nValue>>> */
  7. private array $referenceData;
  8. /** @var I18nValue&PHPUnit\Framework\MockObject\MockObject */
  9. private $value;
  10. public function setUp(): void {
  11. $this->value = $this->getMockBuilder(I18nValue::class)
  12. ->disableOriginalConstructor()
  13. ->getMock();
  14. $this->referenceData = [
  15. 'en' => [
  16. 'file1.php' => [
  17. 'file1.l1.l2.k1' => $this->value,
  18. 'file1.l1.l2.k2' => $this->value,
  19. ],
  20. 'file2.php' => [
  21. 'file2.l1.l2._' => $this->value,
  22. 'file2.l1.l2.k1' => $this->value,
  23. 'file2.l1.l2.k2' => $this->value,
  24. ],
  25. 'file3.php' => [
  26. 'file3.l1.l2._' => $this->value,
  27. 'file3.l1.l2.k1' => $this->value,
  28. ],
  29. ],
  30. ];
  31. }
  32. public function testConstructWhenReferenceOnly(): void {
  33. $data = new I18nData($this->referenceData);
  34. self::assertEquals($this->referenceData, $data->getData());
  35. }
  36. public function testConstructorWhenLanguageIsMissingFile(): void {
  37. $rawData = array_merge($this->referenceData, [
  38. 'fr' => [
  39. 'file1.php' => [
  40. 'file1.l1.l2.k1' => $this->value,
  41. ],
  42. ],
  43. ]);
  44. $data = new I18nData($rawData);
  45. self::assertEquals([
  46. 'en' => [
  47. 'file1.php' => [
  48. 'file1.l1.l2.k1' => $this->value,
  49. 'file1.l1.l2.k2' => $this->value,
  50. ],
  51. 'file2.php' => [
  52. 'file2.l1.l2._' => $this->value,
  53. 'file2.l1.l2.k1' => $this->value,
  54. 'file2.l1.l2.k2' => $this->value,
  55. ],
  56. 'file3.php' => [
  57. 'file3.l1.l2._' => $this->value,
  58. 'file3.l1.l2.k1' => $this->value,
  59. ],
  60. ],
  61. 'fr' => [
  62. 'file1.php' => [
  63. 'file1.l1.l2.k1' => $this->value,
  64. 'file1.l1.l2.k2' => $this->value,
  65. ],
  66. 'file2.php' => [
  67. 'file2.l1.l2._' => $this->value,
  68. 'file2.l1.l2.k1' => $this->value,
  69. 'file2.l1.l2.k2' => $this->value,
  70. ],
  71. 'file3.php' => [
  72. 'file3.l1.l2._' => $this->value,
  73. 'file3.l1.l2.k1' => $this->value,
  74. ],
  75. ],
  76. ], $data->getData());
  77. }
  78. public function testConstructorWhenLanguageIsMissingKeys(): void {
  79. $rawData = array_merge($this->referenceData, [
  80. 'fr' => [
  81. 'file1.php' => [
  82. 'file1.l1.l2.k1' => $this->value,
  83. ],
  84. 'file2.php' => [
  85. 'file2.l1.l2.k1' => $this->value,
  86. ],
  87. ],
  88. ]);
  89. $data = new I18nData($rawData);
  90. self::assertEquals([
  91. 'en' => [
  92. 'file1.php' => [
  93. 'file1.l1.l2.k1' => $this->value,
  94. 'file1.l1.l2.k2' => $this->value,
  95. ],
  96. 'file2.php' => [
  97. 'file2.l1.l2._' => $this->value,
  98. 'file2.l1.l2.k1' => $this->value,
  99. 'file2.l1.l2.k2' => $this->value,
  100. ],
  101. 'file3.php' => [
  102. 'file3.l1.l2._' => $this->value,
  103. 'file3.l1.l2.k1' => $this->value,
  104. ],
  105. ],
  106. 'fr' => [
  107. 'file1.php' => [
  108. 'file1.l1.l2.k1' => $this->value,
  109. 'file1.l1.l2.k2' => $this->value,
  110. ],
  111. 'file2.php' => [
  112. 'file2.l1.l2._' => $this->value,
  113. 'file2.l1.l2.k1' => $this->value,
  114. 'file2.l1.l2.k2' => $this->value,
  115. ],
  116. 'file3.php' => [
  117. 'file3.l1.l2._' => $this->value,
  118. 'file3.l1.l2.k1' => $this->value,
  119. ],
  120. ],
  121. ], $data->getData());
  122. }
  123. public function testConstructorWhenLanguageHasExtraKeys(): void {
  124. $rawData = array_merge($this->referenceData, [
  125. 'fr' => [
  126. 'file1.php' => [
  127. 'file1.l1.l2.k1' => $this->value,
  128. 'file1.l1.l2.k2' => $this->value,
  129. 'file1.l1.l2.k3' => $this->value,
  130. ],
  131. 'file2.php' => [
  132. 'file2.l1.l2.k1' => $this->value,
  133. 'file2.l1.l2.k2' => $this->value,
  134. 'file2.l1.l2.k3' => $this->value,
  135. ],
  136. 'file3.php' => [
  137. 'file3.l1.l2._' => $this->value,
  138. 'file3.l1.l2.k1' => $this->value,
  139. ],
  140. ],
  141. ]);
  142. $data = new I18nData($rawData);
  143. self::assertEquals([
  144. 'en' => [
  145. 'file1.php' => [
  146. 'file1.l1.l2.k1' => $this->value,
  147. 'file1.l1.l2.k2' => $this->value,
  148. ],
  149. 'file2.php' => [
  150. 'file2.l1.l2._' => $this->value,
  151. 'file2.l1.l2.k1' => $this->value,
  152. 'file2.l1.l2.k2' => $this->value,
  153. ],
  154. 'file3.php' => [
  155. 'file3.l1.l2._' => $this->value,
  156. 'file3.l1.l2.k1' => $this->value,
  157. ],
  158. ],
  159. 'fr' => [
  160. 'file1.php' => [
  161. 'file1.l1.l2.k1' => $this->value,
  162. 'file1.l1.l2.k2' => $this->value,
  163. ],
  164. 'file2.php' => [
  165. 'file2.l1.l2._' => $this->value,
  166. 'file2.l1.l2.k1' => $this->value,
  167. 'file2.l1.l2.k2' => $this->value,
  168. ],
  169. 'file3.php' => [
  170. 'file3.l1.l2._' => $this->value,
  171. 'file3.l1.l2.k1' => $this->value,
  172. ],
  173. ],
  174. ], $data->getData());
  175. }
  176. public function testConstructorWhenValueIsIdenticalAndIsMarkedAsIgnore(): void {
  177. $value = $this->getMockBuilder(I18nValue::class)
  178. ->disableOriginalConstructor()
  179. ->getMock();
  180. $value->expects(self::exactly(2))
  181. ->method('isIgnore')
  182. ->willReturn(true);
  183. $value->expects(self::never())
  184. ->method('markAsTodo');
  185. $value->expects(self::exactly(3))
  186. ->method('equal')
  187. ->with($value)
  188. ->willReturn(true);
  189. $rawData = array_merge($this->referenceData, [
  190. 'fr' => [
  191. 'file2.php' => [
  192. 'file2.l1.l2.k1' => $value,
  193. ],
  194. ],
  195. ]);
  196. $rawData['en']['file2.php']['file2.l1.l2.k1'] = $value;
  197. new I18nData($rawData);
  198. }
  199. public function testConstructorWhenValueIsIdenticalAndIsNotMarkedAsIgnore(): void {
  200. $value = $this->getMockBuilder(I18nValue::class)
  201. ->disableOriginalConstructor()
  202. ->getMock();
  203. $value->expects(self::exactly(2))
  204. ->method('isIgnore')
  205. ->willReturn(false);
  206. $value->expects(self::exactly(2))
  207. ->method('markAsTodo');
  208. $value->expects(self::exactly(2))
  209. ->method('equal')
  210. ->with($value)
  211. ->willReturn(true);
  212. $rawData = array_merge($this->referenceData, [
  213. 'fr' => [
  214. 'file2.php' => [
  215. 'file2.l1.l2.k1' => $value,
  216. ],
  217. ],
  218. ]);
  219. $rawData['en']['file2.php']['file2.l1.l2.k1'] = $value;
  220. new I18nData($rawData);
  221. }
  222. public function testConstructorWhenValueIsDifferentAndIsMarkedAsToDo(): void {
  223. $value = $this->getMockBuilder(I18nValue::class)
  224. ->disableOriginalConstructor()
  225. ->getMock();
  226. $value->expects(self::once())
  227. ->method('isTodo')
  228. ->willReturn(true);
  229. $value->expects(self::once())
  230. ->method('markAsDirty');
  231. $rawData = array_merge($this->referenceData, [
  232. 'fr' => [
  233. 'file2.php' => [
  234. 'file2.l1.l2.k1' => $value,
  235. ],
  236. ],
  237. ]);
  238. new I18nData($rawData);
  239. }
  240. public function testConstructorWhenValueIsDifferentAndIsNotMarkedAsTodo(): void {
  241. $value = $this->getMockBuilder(I18nValue::class)
  242. ->disableOriginalConstructor()
  243. ->getMock();
  244. $value->expects(self::once())
  245. ->method('isTodo')
  246. ->willReturn(false);
  247. $value->expects(self::never())
  248. ->method('markAsDirty');
  249. $rawData = array_merge($this->referenceData, [
  250. 'fr' => [
  251. 'file2.php' => [
  252. 'file2.l1.l2.k1' => $value,
  253. ],
  254. ],
  255. ]);
  256. new I18nData($rawData);
  257. }
  258. public function testGetAvailableLanguagesWhenTheyAreSorted(): void {
  259. $rawData = array_merge($this->referenceData, [
  260. 'fr' => [],
  261. 'nl' => [],
  262. ]);
  263. $data = new I18nData($rawData);
  264. self::assertEquals([
  265. 'en',
  266. 'fr',
  267. 'nl',
  268. ], $data->getAvailableLanguages());
  269. }
  270. public function testGetAvailableLanguagesWhenTheyAreNotSorted(): void {
  271. $rawData = array_merge($this->referenceData, [
  272. 'nl' => [],
  273. 'fr' => [],
  274. 'de' => [],
  275. ]);
  276. $data = new I18nData($rawData);
  277. self::assertEquals([
  278. 'de',
  279. 'en',
  280. 'fr',
  281. 'nl',
  282. ], $data->getAvailableLanguages());
  283. }
  284. public function testAddLanguageWhenLanguageExists(): void {
  285. $this->expectException(\Exception::class);
  286. $this->expectExceptionMessage('The selected language already exist.');
  287. $data = new I18nData($this->referenceData);
  288. $data->addLanguage('en');
  289. }
  290. public function testAddLanguageWhenNoReferenceProvided(): void {
  291. $data = new I18nData($this->referenceData);
  292. $data->addLanguage('fr');
  293. self::assertEquals([
  294. 'en' => [
  295. 'file1.php' => [
  296. 'file1.l1.l2.k1' => $this->value,
  297. 'file1.l1.l2.k2' => $this->value,
  298. ],
  299. 'file2.php' => [
  300. 'file2.l1.l2._' => $this->value,
  301. 'file2.l1.l2.k1' => $this->value,
  302. 'file2.l1.l2.k2' => $this->value,
  303. ],
  304. 'file3.php' => [
  305. 'file3.l1.l2._' => $this->value,
  306. 'file3.l1.l2.k1' => $this->value,
  307. ],
  308. ],
  309. 'fr' => [
  310. 'file1.php' => [
  311. 'file1.l1.l2.k1' => $this->value,
  312. 'file1.l1.l2.k2' => $this->value,
  313. ],
  314. 'file2.php' => [
  315. 'file2.l1.l2._' => $this->value,
  316. 'file2.l1.l2.k1' => $this->value,
  317. 'file2.l1.l2.k2' => $this->value,
  318. ],
  319. 'file3.php' => [
  320. 'file3.l1.l2._' => $this->value,
  321. 'file3.l1.l2.k1' => $this->value,
  322. ],
  323. ],
  324. ], $data->getData());
  325. }
  326. public function testAddLanguageWhenUnknownReferenceProvided(): void {
  327. $data = new I18nData($this->referenceData);
  328. $data->addLanguage('fr', 'unknown');
  329. self::assertEquals([
  330. 'en' => [
  331. 'file1.php' => [
  332. 'file1.l1.l2.k1' => $this->value,
  333. 'file1.l1.l2.k2' => $this->value,
  334. ],
  335. 'file2.php' => [
  336. 'file2.l1.l2._' => $this->value,
  337. 'file2.l1.l2.k1' => $this->value,
  338. 'file2.l1.l2.k2' => $this->value,
  339. ],
  340. 'file3.php' => [
  341. 'file3.l1.l2._' => $this->value,
  342. 'file3.l1.l2.k1' => $this->value,
  343. ],
  344. ],
  345. 'fr' => [
  346. 'file1.php' => [
  347. 'file1.l1.l2.k1' => $this->value,
  348. 'file1.l1.l2.k2' => $this->value,
  349. ],
  350. 'file2.php' => [
  351. 'file2.l1.l2._' => $this->value,
  352. 'file2.l1.l2.k1' => $this->value,
  353. 'file2.l1.l2.k2' => $this->value,
  354. ],
  355. 'file3.php' => [
  356. 'file3.l1.l2._' => $this->value,
  357. 'file3.l1.l2.k1' => $this->value,
  358. ],
  359. ],
  360. ], $data->getData());
  361. }
  362. public function testAddLanguageWhenKnownReferenceProvided(): void {
  363. $data = new I18nData($this->referenceData);
  364. $data->addLanguage('fr', 'en');
  365. self::assertEquals([
  366. 'en' => [
  367. 'file1.php' => [
  368. 'file1.l1.l2.k1' => $this->value,
  369. 'file1.l1.l2.k2' => $this->value,
  370. ],
  371. 'file2.php' => [
  372. 'file2.l1.l2._' => $this->value,
  373. 'file2.l1.l2.k1' => $this->value,
  374. 'file2.l1.l2.k2' => $this->value,
  375. ],
  376. 'file3.php' => [
  377. 'file3.l1.l2._' => $this->value,
  378. 'file3.l1.l2.k1' => $this->value,
  379. ],
  380. ],
  381. 'fr' => [
  382. 'file1.php' => [
  383. 'file1.l1.l2.k1' => $this->value,
  384. 'file1.l1.l2.k2' => $this->value,
  385. ],
  386. 'file2.php' => [
  387. 'file2.l1.l2._' => $this->value,
  388. 'file2.l1.l2.k1' => $this->value,
  389. 'file2.l1.l2.k2' => $this->value,
  390. ],
  391. 'file3.php' => [
  392. 'file3.l1.l2._' => $this->value,
  393. 'file3.l1.l2.k1' => $this->value,
  394. ],
  395. ],
  396. ], $data->getData());
  397. }
  398. public function testIsKnownWhenKeyExists(): void {
  399. $data = new I18nData($this->referenceData);
  400. self::assertTrue($data->isKnown('file2.l1.l2.k2'));
  401. }
  402. public function testIsKnownWhenKeyDoesNotExist(): void {
  403. $data = new I18nData($this->referenceData);
  404. self::assertFalse($data->isKnown('file2.l1.l2.k3'));
  405. }
  406. public function testAddKeyWhenKeyExists(): void {
  407. $this->expectException(\Exception::class);
  408. $this->expectExceptionMessage('The selected key already exist.');
  409. $data = new I18nData($this->referenceData);
  410. $data->addKey('file2.l1.l2.k1', 'value');
  411. }
  412. public function testAddKeyWhenParentKeyExists(): void {
  413. $rawData = array_merge($this->referenceData, [
  414. 'fr' => [],
  415. ]);
  416. $data = new I18nData($rawData);
  417. self::assertTrue($data->isKnown('file2.l1.l2.k1'));
  418. self::assertFalse($data->isKnown('file2.l1.l2.k1._'));
  419. self::assertFalse($data->isKnown('file2.l1.l2.k1.sk1'));
  420. $data->addKey('file2.l1.l2.k1.sk1', 'value');
  421. self::assertFalse($data->isKnown('file2.l1.l2.k1'));
  422. self::assertTrue($data->isKnown('file2.l1.l2.k1._'));
  423. self::assertTrue($data->isKnown('file2.l1.l2.k1.sk1'));
  424. }
  425. public function testAddKeyWhenKeyIsParent(): void {
  426. $rawData = array_merge($this->referenceData, [
  427. 'fr' => [],
  428. ]);
  429. $data = new I18nData($rawData);
  430. self::assertFalse($data->isKnown('file1.l1.l2._'));
  431. self::assertTrue($data->isKnown('file1.l1.l2.k1'));
  432. self::assertTrue($data->isKnown('file1.l1.l2.k2'));
  433. $data->addKey('file1.l1.l2', 'value');
  434. self::assertTrue($data->isKnown('file1.l1.l2._'));
  435. self::assertTrue($data->isKnown('file1.l1.l2.k1'));
  436. self::assertTrue($data->isKnown('file1.l1.l2.k2'));
  437. }
  438. public function testAddKey(): void {
  439. $getTargetedValue = static function (I18nData $data, string $language) {
  440. return $data->getData()[$language]['file2.php']['file2.l1.l2.k3'];
  441. };
  442. $rawData = array_merge($this->referenceData, [
  443. 'fr' => [],
  444. ]);
  445. $data = new I18nData($rawData);
  446. self::assertFalse($data->isKnown('file2.l1.l2.k3'));
  447. $data->addKey('file2.l1.l2.k3', 'value');
  448. self::assertTrue($data->isKnown('file2.l1.l2.k3'));
  449. $enValue = $getTargetedValue($data, 'en');
  450. $frValue = $getTargetedValue($data, 'fr');
  451. self::assertInstanceOf(I18nValue::class, $enValue);
  452. self::assertEquals('value', $enValue->getValue());
  453. self::assertTrue($enValue->isTodo());
  454. self::assertEquals($frValue, $enValue);
  455. }
  456. public function testAddValueWhenLanguageDoesNotExist(): void {
  457. $this->expectException(\Exception::class);
  458. $this->expectExceptionMessage('The selected language does not exist.');
  459. $data = new I18nData($this->referenceData);
  460. $data->addValue('file2.l1.l2.k2', 'new value', 'fr');
  461. }
  462. public function testAddValueWhenKeyDoesNotExist(): void {
  463. $this->expectException(\Exception::class);
  464. $this->expectExceptionMessage('The selected key does not exist for the selected language.');
  465. $data = new I18nData($this->referenceData);
  466. $data->addValue('unknown key', 'new value', 'en');
  467. }
  468. public function testAddValueWhenLanguageIsReferenceAndValueInOtherLanguageHasNotChange(): void {
  469. $getTargetedValue = static function (I18nData $data, string $language) {
  470. return $data->getData()[$language]['file2.php']['file2.l1.l2.k2'];
  471. };
  472. $this->value->expects(self::atLeast(2))
  473. ->method('equal')
  474. ->with($this->value)
  475. ->willReturn(true);
  476. $rawData = array_merge($this->referenceData, [
  477. 'fr' => [],
  478. ]);
  479. $data = new I18nData($rawData);
  480. $beforeEnValue = $getTargetedValue($data, 'en');
  481. $beforeFrValue = $getTargetedValue($data, 'fr');
  482. $data->addValue('file2.l1.l2.k2', 'new value', 'en');
  483. $afterEnValue = $getTargetedValue($data, 'en');
  484. $afterFrValue = $getTargetedValue($data, 'fr');
  485. self::assertEquals($this->value, $beforeEnValue);
  486. self::assertEquals($this->value, $beforeFrValue);
  487. self::assertInstanceOf(I18nValue::class, $afterEnValue);
  488. self::assertEquals('new value', $afterEnValue->getValue());
  489. self::assertInstanceOf(I18nValue::class, $afterFrValue);
  490. self::assertEquals('new value', $afterFrValue->getValue());
  491. }
  492. public function testAddValueWhenLanguageIsReferenceAndValueInOtherLanguageHasChange(): void {
  493. $getTargetedValue = static function (I18nData $data, string $language) {
  494. return $data->getData()[$language]['file2.php']['file2.l1.l2.k2'];
  495. };
  496. $this->value->expects(self::any())
  497. ->method('equal')
  498. ->with($this->value)
  499. ->willReturn(true);
  500. $value = $this->getMockBuilder(I18nValue::class)
  501. ->disableOriginalConstructor()
  502. ->getMock();
  503. $rawData = array_merge($this->referenceData, [
  504. 'fr' => [
  505. 'file2.php' => [
  506. 'file2.l1.l2.k2' => $value,
  507. ]
  508. ],
  509. ]);
  510. $data = new I18nData($rawData);
  511. $beforeEnValue = $getTargetedValue($data, 'en');
  512. $beforeFrValue = $getTargetedValue($data, 'fr');
  513. $data->addValue('file2.l1.l2.k2', 'new value', 'en');
  514. $afterEnValue = $getTargetedValue($data, 'en');
  515. $afterFrValue = $getTargetedValue($data, 'fr');
  516. self::assertEquals($this->value, $beforeEnValue);
  517. self::assertEquals($value, $beforeFrValue);
  518. self::assertInstanceOf(I18nValue::class, $afterEnValue);
  519. self::assertEquals('new value', $afterEnValue->getValue());
  520. self::assertEquals($value, $afterFrValue);
  521. }
  522. public function testAddValueWhenLanguageIsNotReference(): void {
  523. $getTargetedValue = static function (I18nData $data, string $language) {
  524. return $data->getData()[$language]['file2.php']['file2.l1.l2.k2'];
  525. };
  526. $rawData = array_merge($this->referenceData, [
  527. 'fr' => [],
  528. ]);
  529. $data = new I18nData($rawData);
  530. $beforeEnValue = $getTargetedValue($data, 'en');
  531. $beforeFrValue = $getTargetedValue($data, 'fr');
  532. $data->addValue('file2.l1.l2.k2', 'new value', 'fr');
  533. $afterEnValue = $getTargetedValue($data, 'en');
  534. $afterFrValue = $getTargetedValue($data, 'fr');
  535. self::assertEquals($this->value, $beforeEnValue);
  536. self::assertEquals($this->value, $beforeFrValue);
  537. self::assertEquals($this->value, $afterEnValue);
  538. self::assertInstanceOf(I18nValue::class, $afterFrValue);
  539. self::assertEquals('new value', $afterFrValue->getValue());
  540. }
  541. public function testRemoveKeyWhenKeyDoesNotExist(): void {
  542. $this->expectException(\Exception::class);
  543. $this->expectExceptionMessage('The selected key does not exist.');
  544. $data = new I18nData($this->referenceData);
  545. $data->removeKey('Unknown key');
  546. }
  547. public function testRemoveKeyWhenKeyHasNoEmptySibling(): void {
  548. $this->expectException(\Exception::class);
  549. $this->expectExceptionMessage('The selected key does not exist.');
  550. $data = new I18nData($this->referenceData);
  551. $data->removeKey('file1.l1.l2');
  552. }
  553. public function testRemoveKeyWhenKeyIsEmptySibling(): void {
  554. $rawData = array_merge($this->referenceData, [
  555. 'fr' => [],
  556. ]);
  557. $data = new I18nData($rawData);
  558. $data->removeKey('file2.l1.l2');
  559. self::assertEquals([
  560. 'en' => [
  561. 'file1.php' => [
  562. 'file1.l1.l2.k1' => $this->value,
  563. 'file1.l1.l2.k2' => $this->value,
  564. ],
  565. 'file2.php' => [
  566. 'file2.l1.l2.k1' => $this->value,
  567. 'file2.l1.l2.k2' => $this->value,
  568. ],
  569. 'file3.php' => [
  570. 'file3.l1.l2._' => $this->value,
  571. 'file3.l1.l2.k1' => $this->value,
  572. ],
  573. ],
  574. 'fr' => [
  575. 'file1.php' => [
  576. 'file1.l1.l2.k1' => $this->value,
  577. 'file1.l1.l2.k2' => $this->value,
  578. ],
  579. 'file2.php' => [
  580. 'file2.l1.l2.k1' => $this->value,
  581. 'file2.l1.l2.k2' => $this->value,
  582. ],
  583. 'file3.php' => [
  584. 'file3.l1.l2._' => $this->value,
  585. 'file3.l1.l2.k1' => $this->value,
  586. ],
  587. ],
  588. ], $data->getData());
  589. }
  590. public function testRemoveKeyWhenKeyIsTheOnlyChild(): void {
  591. $rawData = array_merge($this->referenceData, [
  592. 'fr' => [],
  593. ]);
  594. $data = new I18nData($rawData);
  595. $data->removeKey('file3.l1.l2.k1');
  596. self::assertEquals([
  597. 'en' => [
  598. 'file1.php' => [
  599. 'file1.l1.l2.k1' => $this->value,
  600. 'file1.l1.l2.k2' => $this->value,
  601. ],
  602. 'file2.php' => [
  603. 'file2.l1.l2._' => $this->value,
  604. 'file2.l1.l2.k1' => $this->value,
  605. 'file2.l1.l2.k2' => $this->value,
  606. ],
  607. 'file3.php' => [
  608. 'file3.l1.l2' => $this->value,
  609. ],
  610. ],
  611. 'fr' => [
  612. 'file1.php' => [
  613. 'file1.l1.l2.k1' => $this->value,
  614. 'file1.l1.l2.k2' => $this->value,
  615. ],
  616. 'file2.php' => [
  617. 'file2.l1.l2._' => $this->value,
  618. 'file2.l1.l2.k1' => $this->value,
  619. 'file2.l1.l2.k2' => $this->value,
  620. ],
  621. 'file3.php' => [
  622. 'file3.l1.l2' => $this->value,
  623. ],
  624. ],
  625. ], $data->getData());
  626. }
  627. public function testIgnore(): void {
  628. $value = $this->getMockBuilder(I18nValue::class)
  629. ->disableOriginalConstructor()
  630. ->getMock();
  631. $value->expects(self::once())
  632. ->method('unmarkAsIgnore');
  633. $value->expects(self::exactly(2))
  634. ->method('markAsIgnore');
  635. $rawData = array_merge($this->referenceData, [
  636. 'fr' => [
  637. 'file1.php' => [
  638. 'file1.l1.l2.k1' => $value,
  639. ],
  640. ],
  641. ]);
  642. $data = new I18nData($rawData);
  643. $data->ignore('file1.l1.l2.k1', 'fr');
  644. $data->ignore('file1.l1.l2.k1', 'fr', true);
  645. $data->ignore('file1.l1.l2.k1', 'fr', false);
  646. }
  647. public function testIgnoreUnmodified(): void {
  648. $value = $this->getMockBuilder(I18nValue::class)
  649. ->disableOriginalConstructor()
  650. ->getMock();
  651. $value->expects(self::once())
  652. ->method('unmarkAsIgnore');
  653. $value->expects(self::exactly(2))
  654. ->method('markAsIgnore');
  655. $this->value->expects(self::atLeast(2))
  656. ->method('equal')
  657. ->with($value)
  658. ->willReturn(true);
  659. $rawData = array_merge($this->referenceData, [
  660. 'fr' => [
  661. 'file1.php' => [
  662. 'file1.l1.l2.k1' => $value,
  663. ],
  664. ],
  665. ]);
  666. $data = new I18nData($rawData);
  667. $data->ignore_unmodified('fr');
  668. $data->ignore_unmodified('fr', true);
  669. $data->ignore_unmodified('fr', false);
  670. }
  671. public function testGetLanguage(): void {
  672. $rawData = array_merge($this->referenceData, [
  673. 'fr' => [],
  674. 'nl' => [],
  675. ]);
  676. $data = new I18nData($rawData);
  677. self::assertEquals($this->referenceData['en'], $data->getLanguage('en'));
  678. }
  679. public function testGetReferenceLanguage(): void {
  680. $rawData = array_merge($this->referenceData, [
  681. 'fr' => [],
  682. 'nl' => [],
  683. ]);
  684. $data = new I18nData($rawData);
  685. self::assertEquals($this->referenceData['en'], $data->getReferenceLanguage());
  686. }
  687. }