JsonManipulatorTest.php 20 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033
  1. <?php
  2. /*
  3. * This file is part of Composer.
  4. *
  5. * (c) Nils Adermann <naderman@naderman.de>
  6. * Jordi Boggiano <j.boggiano@seld.be>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Composer\Test\Json;
  12. use Composer\Json\JsonManipulator;
  13. class JsonManipulatorTest extends \PHPUnit_Framework_TestCase
  14. {
  15. /**
  16. * @dataProvider linkProvider
  17. */
  18. public function testAddLink($json, $type, $package, $constraint, $expected)
  19. {
  20. $manipulator = new JsonManipulator($json);
  21. $this->assertTrue($manipulator->addLink($type, $package, $constraint));
  22. $this->assertEquals($expected, $manipulator->getContents());
  23. }
  24. public function linkProvider()
  25. {
  26. return array(
  27. array(
  28. '{}',
  29. 'require',
  30. 'vendor/baz',
  31. 'qux',
  32. '{
  33. "require": {
  34. "vendor/baz": "qux"
  35. }
  36. }
  37. '
  38. ),
  39. array(
  40. '{
  41. "foo": "bar"
  42. }',
  43. 'require',
  44. 'vendor/baz',
  45. 'qux',
  46. '{
  47. "foo": "bar",
  48. "require": {
  49. "vendor/baz": "qux"
  50. }
  51. }
  52. '
  53. ),
  54. array(
  55. '{
  56. "require": {
  57. }
  58. }',
  59. 'require',
  60. 'vendor/baz',
  61. 'qux',
  62. '{
  63. "require": {
  64. "vendor/baz": "qux"
  65. }
  66. }
  67. '
  68. ),
  69. array(
  70. '{
  71. "empty": "",
  72. "require": {
  73. "foo": "bar"
  74. }
  75. }',
  76. 'require',
  77. 'vendor/baz',
  78. 'qux',
  79. '{
  80. "empty": "",
  81. "require": {
  82. "foo": "bar",
  83. "vendor/baz": "qux"
  84. }
  85. }
  86. '
  87. ),
  88. array(
  89. '{
  90. "require":
  91. {
  92. "foo": "bar",
  93. "vendor/baz": "baz"
  94. }
  95. }',
  96. 'require',
  97. 'vendor/baz',
  98. 'qux',
  99. '{
  100. "require":
  101. {
  102. "foo": "bar",
  103. "vendor/baz": "qux"
  104. }
  105. }
  106. '
  107. ),
  108. array(
  109. '{
  110. "require":
  111. {
  112. "foo": "bar",
  113. "vendor\/baz": "baz"
  114. }
  115. }',
  116. 'require',
  117. 'vendor/baz',
  118. 'qux',
  119. '{
  120. "require":
  121. {
  122. "foo": "bar",
  123. "vendor/baz": "qux"
  124. }
  125. }
  126. '
  127. ),
  128. array(
  129. '{
  130. "require": {
  131. "foo": "bar"
  132. },
  133. "repositories": [{
  134. "type": "package",
  135. "package": {
  136. "require": {
  137. "foo": "bar"
  138. }
  139. }
  140. }]
  141. }',
  142. 'require',
  143. 'foo',
  144. 'qux',
  145. '{
  146. "require": {
  147. "foo": "qux"
  148. },
  149. "repositories": [{
  150. "type": "package",
  151. "package": {
  152. "require": {
  153. "foo": "bar"
  154. }
  155. }
  156. }]
  157. }
  158. '
  159. ),
  160. array(
  161. '{
  162. "repositories": [{
  163. "type": "package",
  164. "package": {
  165. "require": {
  166. "foo": "bar"
  167. }
  168. }
  169. }]
  170. }',
  171. 'require',
  172. 'foo',
  173. 'qux',
  174. '{
  175. "repositories": [{
  176. "type": "package",
  177. "package": {
  178. "require": {
  179. "foo": "bar"
  180. }
  181. }
  182. }],
  183. "require": {
  184. "foo": "qux"
  185. }
  186. }
  187. '
  188. ),
  189. array(
  190. '{
  191. "require": {
  192. "php": "5.*"
  193. }
  194. }',
  195. 'require-dev',
  196. 'foo',
  197. 'qux',
  198. '{
  199. "require": {
  200. "php": "5.*"
  201. },
  202. "require-dev": {
  203. "foo": "qux"
  204. }
  205. }
  206. '
  207. ),
  208. array(
  209. '{
  210. "require": {
  211. "php": "5.*"
  212. },
  213. "require-dev": {
  214. "foo": "bar"
  215. }
  216. }',
  217. 'require-dev',
  218. 'foo',
  219. 'qux',
  220. '{
  221. "require": {
  222. "php": "5.*"
  223. },
  224. "require-dev": {
  225. "foo": "qux"
  226. }
  227. }
  228. '
  229. ),
  230. array(
  231. '{
  232. "repositories": [{
  233. "type": "package",
  234. "package": {
  235. "bar": "ba[z",
  236. "dist": {
  237. "url": "http...",
  238. "type": "zip"
  239. },
  240. "autoload": {
  241. "classmap": [ "foo/bar" ]
  242. }
  243. }
  244. }],
  245. "require": {
  246. "php": "5.*"
  247. },
  248. "require-dev": {
  249. "foo": "bar"
  250. }
  251. }',
  252. 'require-dev',
  253. 'foo',
  254. 'qux',
  255. '{
  256. "repositories": [{
  257. "type": "package",
  258. "package": {
  259. "bar": "ba[z",
  260. "dist": {
  261. "url": "http...",
  262. "type": "zip"
  263. },
  264. "autoload": {
  265. "classmap": [ "foo/bar" ]
  266. }
  267. }
  268. }],
  269. "require": {
  270. "php": "5.*"
  271. },
  272. "require-dev": {
  273. "foo": "qux"
  274. }
  275. }
  276. '
  277. ),
  278. );
  279. }
  280. /**
  281. * @dataProvider providerAddLinkAndSortPackages
  282. */
  283. public function testAddLinkAndSortPackages($json, $type, $package, $constraint, $sortPackages, $expected)
  284. {
  285. $manipulator = new JsonManipulator($json);
  286. $this->assertTrue($manipulator->addLink($type, $package, $constraint, $sortPackages));
  287. $this->assertEquals($expected, $manipulator->getContents());
  288. }
  289. public function providerAddLinkAndSortPackages()
  290. {
  291. return array(
  292. array(
  293. '{
  294. "require": {
  295. "vendor/baz": "qux"
  296. }
  297. }',
  298. 'require',
  299. 'foo',
  300. 'bar',
  301. true,
  302. '{
  303. "require": {
  304. "foo": "bar",
  305. "vendor/baz": "qux"
  306. }
  307. }
  308. '
  309. ),
  310. array(
  311. '{
  312. "require": {
  313. "vendor/baz": "qux"
  314. }
  315. }',
  316. 'require',
  317. 'foo',
  318. 'bar',
  319. false,
  320. '{
  321. "require": {
  322. "vendor/baz": "qux",
  323. "foo": "bar"
  324. }
  325. }
  326. '
  327. ),
  328. );
  329. }
  330. /**
  331. * @dataProvider removeSubNodeProvider
  332. */
  333. public function testRemoveSubNode($json, $name, $expected, $expectedContent = null)
  334. {
  335. $manipulator = new JsonManipulator($json);
  336. $this->assertEquals($expected, $manipulator->removeSubNode('repositories', $name));
  337. if (null !== $expectedContent) {
  338. $this->assertEquals($expectedContent, $manipulator->getContents());
  339. }
  340. }
  341. public function removeSubNodeProvider()
  342. {
  343. return array(
  344. 'works on simple ones first' => array(
  345. '{
  346. "repositories": {
  347. "foo": {
  348. "foo": "bar",
  349. "bar": "baz"
  350. },
  351. "bar": {
  352. "foo": "bar",
  353. "bar": "baz"
  354. }
  355. }
  356. }',
  357. 'foo',
  358. true,
  359. '{
  360. "repositories": {
  361. "bar": {
  362. "foo": "bar",
  363. "bar": "baz"
  364. }
  365. }
  366. }
  367. '
  368. ),
  369. 'works on simple ones last' => array(
  370. '{
  371. "repositories": {
  372. "foo": {
  373. "foo": "bar",
  374. "bar": "baz"
  375. },
  376. "bar": {
  377. "foo": "bar",
  378. "bar": "baz"
  379. }
  380. }
  381. }',
  382. 'bar',
  383. true,
  384. '{
  385. "repositories": {
  386. "foo": {
  387. "foo": "bar",
  388. "bar": "baz"
  389. }
  390. }
  391. }
  392. '
  393. ),
  394. 'works on simple ones unique' => array(
  395. '{
  396. "repositories": {
  397. "foo": {
  398. "foo": "bar",
  399. "bar": "baz"
  400. }
  401. }
  402. }',
  403. 'foo',
  404. true,
  405. '{
  406. "repositories": {
  407. }
  408. }
  409. '
  410. ),
  411. 'works on simple ones middle' => array(
  412. '{
  413. "repositories": {
  414. "foo": {
  415. "foo": "bar",
  416. "bar": "baz"
  417. },
  418. "bar": {
  419. "foo": "bar",
  420. "bar": "baz"
  421. },
  422. "baz": {
  423. "foo": "bar",
  424. "bar": "baz"
  425. }
  426. }
  427. }',
  428. 'bar',
  429. true,
  430. '{
  431. "repositories": {
  432. "foo": {
  433. "foo": "bar",
  434. "bar": "baz"
  435. },
  436. "baz": {
  437. "foo": "bar",
  438. "bar": "baz"
  439. }
  440. }
  441. }
  442. '
  443. ),
  444. 'works on undefined ones' => array(
  445. '{
  446. "repositories": {
  447. "main": {
  448. "foo": "bar",
  449. "bar": "baz"
  450. }
  451. }
  452. }',
  453. 'removenotthere',
  454. true,
  455. '{
  456. "repositories": {
  457. "main": {
  458. "foo": "bar",
  459. "bar": "baz"
  460. }
  461. }
  462. }
  463. '
  464. ),
  465. 'works on child having unmatched name' => array(
  466. '{
  467. "repositories": {
  468. "baz": {
  469. "foo": "bar",
  470. "bar": "baz"
  471. }
  472. }
  473. }',
  474. 'bar',
  475. true,
  476. '{
  477. "repositories": {
  478. "baz": {
  479. "foo": "bar",
  480. "bar": "baz"
  481. }
  482. }
  483. }
  484. '
  485. ),
  486. 'works on child having duplicate name' => array(
  487. '{
  488. "repositories": {
  489. "foo": {
  490. "baz": "qux"
  491. },
  492. "baz": {
  493. "foo": "bar",
  494. "bar": "baz"
  495. }
  496. }
  497. }',
  498. 'baz',
  499. true,
  500. '{
  501. "repositories": {
  502. "foo": {
  503. "baz": "qux"
  504. }
  505. }
  506. }
  507. '
  508. ),
  509. 'works on empty repos' => array(
  510. '{
  511. "repositories": {
  512. }
  513. }',
  514. 'bar',
  515. true
  516. ),
  517. 'works on empty repos2' => array(
  518. '{
  519. "repositories": {}
  520. }',
  521. 'bar',
  522. true
  523. ),
  524. 'works on missing repos' => array(
  525. "{\n}",
  526. 'bar',
  527. true
  528. ),
  529. 'works on deep repos' => array(
  530. '{
  531. "repositories": {
  532. "foo": {
  533. "package": { "bar": "baz" }
  534. }
  535. }
  536. }',
  537. 'foo',
  538. true,
  539. '{
  540. "repositories": {
  541. }
  542. }
  543. '
  544. ),
  545. 'fails on deep repos with borked texts' => array(
  546. '{
  547. "repositories": {
  548. "foo": {
  549. "package": { "bar": "ba{z" }
  550. }
  551. }
  552. }',
  553. 'bar',
  554. false
  555. ),
  556. 'fails on deep repos with borked texts2' => array(
  557. '{
  558. "repositories": {
  559. "foo": {
  560. "package": { "bar": "ba}z" }
  561. }
  562. }
  563. }',
  564. 'bar',
  565. false
  566. ),
  567. 'fails on deep arrays with borked texts' => array(
  568. '{
  569. "repositories": [{
  570. "package": { "bar": "ba[z" }
  571. }]
  572. }',
  573. 'bar',
  574. false
  575. ),
  576. 'fails on deep arrays with borked texts2' => array(
  577. '{
  578. "repositories": [{
  579. "package": { "bar": "ba]z" }
  580. }]
  581. }',
  582. 'bar',
  583. false
  584. ),
  585. );
  586. }
  587. public function testRemoveSubNodeFromRequire()
  588. {
  589. $manipulator = new JsonManipulator('{
  590. "repositories": [
  591. {
  592. "package": {
  593. "require": {
  594. "this/should-not-end-up-in-root-require": "~2.0"
  595. }
  596. }
  597. }
  598. ],
  599. "require": {
  600. "package/a": "*",
  601. "package/b": "*",
  602. "package/c": "*"
  603. }
  604. }');
  605. $this->assertTrue($manipulator->removeSubNode('require', 'package/c'));
  606. $this->assertEquals('{
  607. "repositories": [
  608. {
  609. "package": {
  610. "require": {
  611. "this/should-not-end-up-in-root-require": "~2.0"
  612. }
  613. }
  614. }
  615. ],
  616. "require": {
  617. "package/a": "*",
  618. "package/b": "*"
  619. }
  620. }
  621. ', $manipulator->getContents());
  622. }
  623. public function testAddRepositoryCanInitializeEmptyRepositories()
  624. {
  625. $manipulator = new JsonManipulator('{
  626. "repositories": {
  627. }
  628. }');
  629. $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer')));
  630. $this->assertEquals('{
  631. "repositories": {
  632. "bar": {
  633. "type": "composer"
  634. }
  635. }
  636. }
  637. ', $manipulator->getContents());
  638. }
  639. public function testAddRepositoryCanInitializeFromScratch()
  640. {
  641. $manipulator = new JsonManipulator("{
  642. \t\"a\": \"b\"
  643. }");
  644. $this->assertTrue($manipulator->addRepository('bar2', array('type' => 'composer')));
  645. $this->assertEquals("{
  646. \t\"a\": \"b\",
  647. \t\"repositories\": {
  648. \t\t\"bar2\": {
  649. \t\t\t\"type\": \"composer\"
  650. \t\t}
  651. \t}
  652. }
  653. ", $manipulator->getContents());
  654. }
  655. public function testAddRepositoryCanAdd()
  656. {
  657. $manipulator = new JsonManipulator('{
  658. "repositories": {
  659. "foo": {
  660. "type": "vcs",
  661. "url": "lala"
  662. }
  663. }
  664. }');
  665. $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer')));
  666. $this->assertEquals('{
  667. "repositories": {
  668. "foo": {
  669. "type": "vcs",
  670. "url": "lala"
  671. },
  672. "bar": {
  673. "type": "composer"
  674. }
  675. }
  676. }
  677. ', $manipulator->getContents());
  678. }
  679. public function testAddRepositoryCanOverrideDeepRepos()
  680. {
  681. $manipulator = new JsonManipulator('{
  682. "repositories": {
  683. "baz": {
  684. "type": "package",
  685. "package": {}
  686. }
  687. }
  688. }');
  689. $this->assertTrue($manipulator->addRepository('baz', array('type' => 'composer')));
  690. $this->assertEquals('{
  691. "repositories": {
  692. "baz": {
  693. "type": "composer"
  694. }
  695. }
  696. }
  697. ', $manipulator->getContents());
  698. }
  699. public function testAddConfigSettingEscapes()
  700. {
  701. $manipulator = new JsonManipulator('{
  702. "config": {
  703. }
  704. }');
  705. $this->assertTrue($manipulator->addConfigSetting('test', 'a\b'));
  706. $this->assertTrue($manipulator->addConfigSetting('test2', "a\nb\fa"));
  707. $this->assertEquals('{
  708. "config": {
  709. "test": "a\\\\b",
  710. "test2": "a\nb\fa"
  711. }
  712. }
  713. ', $manipulator->getContents());
  714. }
  715. public function testAddConfigSettingCanAdd()
  716. {
  717. $manipulator = new JsonManipulator('{
  718. "config": {
  719. "foo": "bar"
  720. }
  721. }');
  722. $this->assertTrue($manipulator->addConfigSetting('bar', 'baz'));
  723. $this->assertEquals('{
  724. "config": {
  725. "foo": "bar",
  726. "bar": "baz"
  727. }
  728. }
  729. ', $manipulator->getContents());
  730. }
  731. public function testAddConfigSettingCanOverwrite()
  732. {
  733. $manipulator = new JsonManipulator('{
  734. "config": {
  735. "foo": "bar",
  736. "bar": "baz"
  737. }
  738. }');
  739. $this->assertTrue($manipulator->addConfigSetting('foo', 'zomg'));
  740. $this->assertEquals('{
  741. "config": {
  742. "foo": "zomg",
  743. "bar": "baz"
  744. }
  745. }
  746. ', $manipulator->getContents());
  747. }
  748. public function testAddConfigSettingCanOverwriteNumbers()
  749. {
  750. $manipulator = new JsonManipulator('{
  751. "config": {
  752. "foo": 500
  753. }
  754. }');
  755. $this->assertTrue($manipulator->addConfigSetting('foo', 50));
  756. $this->assertEquals('{
  757. "config": {
  758. "foo": 50
  759. }
  760. }
  761. ', $manipulator->getContents());
  762. }
  763. public function testAddConfigSettingCanOverwriteArrays()
  764. {
  765. $manipulator = new JsonManipulator('{
  766. "config": {
  767. "github-oauth": {
  768. "github.com": "foo"
  769. },
  770. "github-protocols": ["https"]
  771. }
  772. }');
  773. $this->assertTrue($manipulator->addConfigSetting('github-protocols', array('https', 'http')));
  774. $this->assertEquals('{
  775. "config": {
  776. "github-oauth": {
  777. "github.com": "foo"
  778. },
  779. "github-protocols": ["https", "http"]
  780. }
  781. }
  782. ', $manipulator->getContents());
  783. $this->assertTrue($manipulator->addConfigSetting('github-oauth', array('github.com' => 'bar', 'alt.example.org' => 'baz')));
  784. $this->assertEquals('{
  785. "config": {
  786. "github-oauth": {
  787. "github.com": "bar",
  788. "alt.example.org": "baz"
  789. },
  790. "github-protocols": ["https", "http"]
  791. }
  792. }
  793. ', $manipulator->getContents());
  794. }
  795. public function testAddConfigSettingCanAddSubKeyInEmptyConfig()
  796. {
  797. $manipulator = new JsonManipulator('{
  798. "config": {
  799. }
  800. }');
  801. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  802. $this->assertEquals('{
  803. "config": {
  804. "github-oauth": {
  805. "bar": "baz"
  806. }
  807. }
  808. }
  809. ', $manipulator->getContents());
  810. }
  811. public function testAddConfigSettingCanAddSubKeyInEmptyVal()
  812. {
  813. $manipulator = new JsonManipulator('{
  814. "config": {
  815. "github-oauth": {},
  816. "github-oauth2": {
  817. }
  818. }
  819. }');
  820. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  821. $this->assertTrue($manipulator->addConfigSetting('github-oauth2.a.bar', 'baz2'));
  822. $this->assertTrue($manipulator->addConfigSetting('github-oauth3.b', 'c'));
  823. $this->assertEquals('{
  824. "config": {
  825. "github-oauth": {
  826. "bar": "baz"
  827. },
  828. "github-oauth2": {
  829. "a.bar": "baz2"
  830. },
  831. "github-oauth3": {
  832. "b": "c"
  833. }
  834. }
  835. }
  836. ', $manipulator->getContents());
  837. }
  838. public function testAddConfigSettingCanAddSubKeyInHash()
  839. {
  840. $manipulator = new JsonManipulator('{
  841. "config": {
  842. "github-oauth": {
  843. "github.com": "foo"
  844. }
  845. }
  846. }');
  847. $this->assertTrue($manipulator->addConfigSetting('github-oauth.bar', 'baz'));
  848. $this->assertEquals('{
  849. "config": {
  850. "github-oauth": {
  851. "github.com": "foo",
  852. "bar": "baz"
  853. }
  854. }
  855. }
  856. ', $manipulator->getContents());
  857. }
  858. public function testAddRootSettingDoesNotBreakDots()
  859. {
  860. $manipulator = new JsonManipulator('{
  861. "github-oauth": {
  862. "github.com": "foo"
  863. }
  864. }');
  865. $this->assertTrue($manipulator->addSubNode('github-oauth', 'bar', 'baz'));
  866. $this->assertEquals('{
  867. "github-oauth": {
  868. "github.com": "foo",
  869. "bar": "baz"
  870. }
  871. }
  872. ', $manipulator->getContents());
  873. }
  874. public function testRemoveConfigSettingCanRemoveSubKeyInHash()
  875. {
  876. $manipulator = new JsonManipulator('{
  877. "config": {
  878. "github-oauth": {
  879. "github.com": "foo",
  880. "bar": "baz"
  881. }
  882. }
  883. }');
  884. $this->assertTrue($manipulator->removeConfigSetting('github-oauth.bar'));
  885. $this->assertEquals('{
  886. "config": {
  887. "github-oauth": {
  888. "github.com": "foo"
  889. }
  890. }
  891. }
  892. ', $manipulator->getContents());
  893. }
  894. public function testRemoveConfigSettingCanRemoveSubKeyInHashWithSiblings()
  895. {
  896. $manipulator = new JsonManipulator('{
  897. "config": {
  898. "foo": "bar",
  899. "github-oauth": {
  900. "github.com": "foo",
  901. "bar": "baz"
  902. }
  903. }
  904. }');
  905. $this->assertTrue($manipulator->removeConfigSetting('github-oauth.bar'));
  906. $this->assertEquals('{
  907. "config": {
  908. "foo": "bar",
  909. "github-oauth": {
  910. "github.com": "foo"
  911. }
  912. }
  913. }
  914. ', $manipulator->getContents());
  915. }
  916. public function testAddMainKey()
  917. {
  918. $manipulator = new JsonManipulator('{
  919. "foo": "bar"
  920. }');
  921. $this->assertTrue($manipulator->addMainKey('bar', 'baz'));
  922. $this->assertEquals('{
  923. "foo": "bar",
  924. "bar": "baz"
  925. }
  926. ', $manipulator->getContents());
  927. }
  928. public function testUpdateMainKey()
  929. {
  930. $manipulator = new JsonManipulator('{
  931. "foo": "bar"
  932. }');
  933. $this->assertTrue($manipulator->addMainKey('foo', 'baz'));
  934. $this->assertEquals('{
  935. "foo": "baz"
  936. }
  937. ', $manipulator->getContents());
  938. }
  939. public function testUpdateMainKey2()
  940. {
  941. $manipulator = new JsonManipulator('{
  942. "a": {
  943. "foo": "bar",
  944. "baz": "qux"
  945. },
  946. "foo": "bar",
  947. "baz": "bar"
  948. }');
  949. $this->assertTrue($manipulator->addMainKey('foo', 'baz'));
  950. $this->assertTrue($manipulator->addMainKey('baz', 'quux'));
  951. $this->assertEquals('{
  952. "a": {
  953. "foo": "bar",
  954. "baz": "qux"
  955. },
  956. "foo": "baz",
  957. "baz": "quux"
  958. }
  959. ', $manipulator->getContents());
  960. }
  961. public function testUpdateMainKey3()
  962. {
  963. $manipulator = new JsonManipulator('{
  964. "require": {
  965. "php": "5.*"
  966. },
  967. "require-dev": {
  968. "foo": "bar"
  969. }
  970. }');
  971. $this->assertTrue($manipulator->addMainKey('require-dev', array('foo' => 'qux')));
  972. $this->assertEquals('{
  973. "require": {
  974. "php": "5.*"
  975. },
  976. "require-dev": {
  977. "foo": "qux"
  978. }
  979. }
  980. ', $manipulator->getContents());
  981. }
  982. }