JsonManipulatorTest.php 20 KB

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