VCardConverterTest.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. <?php
  2. namespace Sabre\VObject;
  3. class VCardConverterTest extends TestCase {
  4. function testConvert30to40() {
  5. $input = <<<IN
  6. BEGIN:VCARD
  7. VERSION:3.0
  8. PRODID:foo
  9. FN;CHARSET=UTF-8:Steve
  10. TEL;TYPE=PREF,HOME:+1 555 666 777
  11. ITEM1.TEL:+1 444 555 666
  12. ITEM1.X-ABLABEL:CustomLabel
  13. PHOTO;ENCODING=b;TYPE=JPEG,HOME:Zm9v
  14. PHOTO;ENCODING=b;TYPE=GIF:Zm9v
  15. PHOTO;X-PARAM=FOO;ENCODING=b;TYPE=PNG:Zm9v
  16. PHOTO;VALUE=URI:http://example.org/foo.png
  17. X-ABShowAs:COMPANY
  18. END:VCARD
  19. IN;
  20. $output = <<<OUT
  21. BEGIN:VCARD
  22. VERSION:4.0
  23. FN:Steve
  24. TEL;PREF=1;TYPE=HOME:+1 555 666 777
  25. ITEM1.TEL:+1 444 555 666
  26. ITEM1.X-ABLABEL:CustomLabel
  27. PHOTO;TYPE=HOME:data:image/jpeg;base64,Zm9v
  28. PHOTO:data:image/gif;base64,Zm9v
  29. PHOTO;X-PARAM=FOO:data:image/png;base64,Zm9v
  30. PHOTO:http://example.org/foo.png
  31. KIND:ORG
  32. END:VCARD
  33. OUT;
  34. $vcard = Reader::read($input);
  35. $vcard = $vcard->convert(Document::VCARD40);
  36. $this->assertVObjEquals(
  37. $output,
  38. $vcard
  39. );
  40. }
  41. function testConvert40to40() {
  42. $input = <<<IN
  43. BEGIN:VCARD
  44. VERSION:4.0
  45. FN:Steve
  46. TEL;PREF=1;TYPE=HOME:+1 555 666 777
  47. PHOTO:data:image/jpeg;base64,Zm9v
  48. PHOTO:data:image/gif;base64,Zm9v
  49. PHOTO;X-PARAM=FOO:data:image/png;base64,Zm9v
  50. PHOTO:http://example.org/foo.png
  51. END:VCARD
  52. IN;
  53. $output = <<<OUT
  54. BEGIN:VCARD
  55. VERSION:4.0
  56. FN:Steve
  57. TEL;PREF=1;TYPE=HOME:+1 555 666 777
  58. PHOTO:data:image/jpeg;base64,Zm9v
  59. PHOTO:data:image/gif;base64,Zm9v
  60. PHOTO;X-PARAM=FOO:data:image/png;base64,Zm9v
  61. PHOTO:http://example.org/foo.png
  62. END:VCARD
  63. OUT;
  64. $vcard = Reader::read($input);
  65. $vcard = $vcard->convert(Document::VCARD40);
  66. $this->assertVObjEquals(
  67. $output,
  68. $vcard
  69. );
  70. }
  71. function testConvert21to40() {
  72. $input = <<<IN
  73. BEGIN:VCARD
  74. VERSION:2.1
  75. N:Family;Johnson
  76. FN:Johnson Family
  77. TEL;HOME;VOICE:555-12345-345
  78. ADR;HOME:;;100 Street Lane;Saubel Beach;ON;H0H0H0
  79. LABEL;HOME;ENCODING=QUOTED-PRINTABLE:100 Street Lane=0D=0ASaubel Beach,
  80. ON H0H0H0
  81. REV:20110731T040251Z
  82. UID:12345678
  83. END:VCARD
  84. IN;
  85. $output = <<<OUT
  86. BEGIN:VCARD
  87. VERSION:4.0
  88. N:Family;Johnson;;;
  89. FN:Johnson Family
  90. TEL;TYPE=HOME,VOICE:555-12345-345
  91. ADR;TYPE=HOME:;;100 Street Lane;Saubel Beach;ON;H0H0H0;
  92. REV:20110731T040251Z
  93. UID:12345678
  94. END:VCARD
  95. OUT;
  96. $vcard = Reader::read($input);
  97. $vcard = $vcard->convert(Document::VCARD40);
  98. $this->assertVObjEquals(
  99. $output,
  100. $vcard
  101. );
  102. }
  103. function testConvert30to30() {
  104. $input = <<<IN
  105. BEGIN:VCARD
  106. VERSION:3.0
  107. PRODID:foo
  108. FN;CHARSET=UTF-8:Steve
  109. TEL;TYPE=PREF,HOME:+1 555 666 777
  110. PHOTO;ENCODING=b;TYPE=JPEG:Zm9v
  111. PHOTO;ENCODING=b;TYPE=GIF:Zm9v
  112. PHOTO;X-PARAM=FOO;ENCODING=b;TYPE=PNG:Zm9v
  113. PHOTO;VALUE=URI:http://example.org/foo.png
  114. END:VCARD
  115. IN;
  116. $output = <<<OUT
  117. BEGIN:VCARD
  118. VERSION:3.0
  119. PRODID:foo
  120. FN;CHARSET=UTF-8:Steve
  121. TEL;TYPE=PREF,HOME:+1 555 666 777
  122. PHOTO;ENCODING=b;TYPE=JPEG:Zm9v
  123. PHOTO;ENCODING=b;TYPE=GIF:Zm9v
  124. PHOTO;X-PARAM=FOO;ENCODING=b;TYPE=PNG:Zm9v
  125. PHOTO;VALUE=URI:http://example.org/foo.png
  126. END:VCARD
  127. OUT;
  128. $vcard = Reader::read($input);
  129. $vcard = $vcard->convert(Document::VCARD30);
  130. $this->assertVObjEquals(
  131. $output,
  132. $vcard
  133. );
  134. }
  135. function testConvert40to30() {
  136. $input = <<<IN
  137. BEGIN:VCARD
  138. VERSION:4.0
  139. PRODID:foo
  140. FN:Steve
  141. TEL;PREF=1;TYPE=HOME:+1 555 666 777
  142. PHOTO:data:image/jpeg;base64,Zm9v
  143. PHOTO:data:image/gif,foo
  144. PHOTO;X-PARAM=FOO:data:image/png;base64,Zm9v
  145. PHOTO:http://example.org/foo.png
  146. KIND:ORG
  147. END:VCARD
  148. IN;
  149. $output = <<<OUT
  150. BEGIN:VCARD
  151. VERSION:3.0
  152. FN:Steve
  153. TEL;TYPE=PREF,HOME:+1 555 666 777
  154. PHOTO;ENCODING=b;TYPE=JPEG:Zm9v
  155. PHOTO;ENCODING=b;TYPE=GIF:Zm9v
  156. PHOTO;ENCODING=b;TYPE=PNG;X-PARAM=FOO:Zm9v
  157. PHOTO;VALUE=URI:http://example.org/foo.png
  158. X-ABSHOWAS:COMPANY
  159. END:VCARD
  160. OUT;
  161. $vcard = Reader::read($input);
  162. $vcard = $vcard->convert(Document::VCARD30);
  163. $this->assertVObjEquals(
  164. $output,
  165. $vcard
  166. );
  167. }
  168. function testConvertGroupCard() {
  169. $input = <<<IN
  170. BEGIN:VCARD
  171. VERSION:3.0
  172. PRODID:foo
  173. X-ADDRESSBOOKSERVER-KIND:GROUP
  174. END:VCARD
  175. IN;
  176. $output = <<<OUT
  177. BEGIN:VCARD
  178. VERSION:4.0
  179. KIND:GROUP
  180. END:VCARD
  181. OUT;
  182. $vcard = Reader::read($input);
  183. $vcard = $vcard->convert(Document::VCARD40);
  184. $this->assertVObjEquals(
  185. $output,
  186. $vcard
  187. );
  188. $input = $output;
  189. $output = <<<OUT
  190. BEGIN:VCARD
  191. VERSION:3.0
  192. X-ADDRESSBOOKSERVER-KIND:GROUP
  193. END:VCARD
  194. OUT;
  195. $vcard = Reader::read($input);
  196. $vcard = $vcard->convert(Document::VCARD30);
  197. $this->assertVObjEquals(
  198. $output,
  199. $vcard
  200. );
  201. }
  202. function testBDAYConversion() {
  203. $input = <<<IN
  204. BEGIN:VCARD
  205. VERSION:3.0
  206. PRODID:foo
  207. BDAY;X-APPLE-OMIT-YEAR=1604:1604-04-16
  208. END:VCARD
  209. IN;
  210. $output = <<<OUT
  211. BEGIN:VCARD
  212. VERSION:4.0
  213. BDAY:--04-16
  214. END:VCARD
  215. OUT;
  216. $vcard = Reader::read($input);
  217. $vcard = $vcard->convert(Document::VCARD40);
  218. $this->assertVObjEquals(
  219. $output,
  220. $vcard
  221. );
  222. $input = $output;
  223. $output = <<<OUT
  224. BEGIN:VCARD
  225. VERSION:3.0
  226. BDAY;X-APPLE-OMIT-YEAR=1604:1604-04-16
  227. END:VCARD
  228. OUT;
  229. $vcard = Reader::read($input);
  230. $vcard = $vcard->convert(Document::VCARD30);
  231. $this->assertVObjEquals(
  232. $output,
  233. $vcard
  234. );
  235. }
  236. /**
  237. * @expectedException InvalidArgumentException
  238. */
  239. function testUnknownSourceVCardVersion() {
  240. $input = <<<IN
  241. BEGIN:VCARD
  242. VERSION:4.2
  243. PRODID:foo
  244. FN;CHARSET=UTF-8:Steve
  245. TEL;TYPE=PREF,HOME:+1 555 666 777
  246. ITEM1.TEL:+1 444 555 666
  247. ITEM1.X-ABLABEL:CustomLabel
  248. PHOTO;ENCODING=b;TYPE=JPEG,HOME:Zm9v
  249. PHOTO;ENCODING=b;TYPE=GIF:Zm9v
  250. PHOTO;X-PARAM=FOO;ENCODING=b;TYPE=PNG:Zm9v
  251. PHOTO;VALUE=URI:http://example.org/foo.png
  252. X-ABShowAs:COMPANY
  253. END:VCARD
  254. IN;
  255. $vcard = Reader::read($input);
  256. $vcard->convert(Document::VCARD40);
  257. }
  258. /**
  259. * @expectedException InvalidArgumentException
  260. */
  261. function testUnknownTargetVCardVersion() {
  262. $input = <<<IN
  263. BEGIN:VCARD
  264. VERSION:3.0
  265. PRODID:foo
  266. END:VCARD
  267. IN;
  268. $vcard = Reader::read($input);
  269. $vcard->convert(Document::VCARD21);
  270. }
  271. function testConvertIndividualCard() {
  272. $input = <<<IN
  273. BEGIN:VCARD
  274. VERSION:4.0
  275. PRODID:foo
  276. KIND:INDIVIDUAL
  277. END:VCARD
  278. IN;
  279. $output = <<<OUT
  280. BEGIN:VCARD
  281. VERSION:3.0
  282. END:VCARD
  283. OUT;
  284. $vcard = Reader::read($input);
  285. $vcard = $vcard->convert(Document::VCARD30);
  286. $this->assertVObjEquals(
  287. $output,
  288. $vcard
  289. );
  290. $input = $output;
  291. $output = <<<OUT
  292. BEGIN:VCARD
  293. VERSION:4.0
  294. END:VCARD
  295. OUT;
  296. $vcard = Reader::read($input);
  297. $vcard = $vcard->convert(Document::VCARD40);
  298. $this->assertVObjEquals(
  299. $output,
  300. $vcard
  301. );
  302. }
  303. function testAnniversary() {
  304. $input = <<<IN
  305. BEGIN:VCARD
  306. VERSION:4.0
  307. ITEM1.ANNIVERSARY:20081210
  308. END:VCARD
  309. IN;
  310. $output = <<<'OUT'
  311. BEGIN:VCARD
  312. VERSION:3.0
  313. ITEM1.X-ABDATE;VALUE=DATE-AND-OR-TIME:20081210
  314. ITEM1.X-ABLABEL:_$!<Anniversary>!$_
  315. ITEM1.X-ANNIVERSARY;VALUE=DATE-AND-OR-TIME:20081210
  316. END:VCARD
  317. OUT;
  318. $vcard = Reader::read($input);
  319. $vcard = $vcard->convert(Document::VCARD30);
  320. $this->assertVObjEquals(
  321. $output,
  322. $vcard
  323. );
  324. // Swapping input and output
  325. list(
  326. $input,
  327. $output
  328. ) = array(
  329. $output,
  330. $input
  331. );
  332. $vcard = Reader::read($input);
  333. $vcard = $vcard->convert(Document::VCARD40);
  334. $this->assertVObjEquals(
  335. $output,
  336. $vcard
  337. );
  338. }
  339. function testMultipleAnniversaries() {
  340. $input = <<<IN
  341. BEGIN:VCARD
  342. VERSION:4.0
  343. ITEM1.ANNIVERSARY:20081210
  344. ITEM2.ANNIVERSARY:20091210
  345. ITEM3.ANNIVERSARY:20101210
  346. END:VCARD
  347. IN;
  348. $output = <<<'OUT'
  349. BEGIN:VCARD
  350. VERSION:3.0
  351. ITEM1.X-ABDATE;VALUE=DATE-AND-OR-TIME:20081210
  352. ITEM1.X-ABLABEL:_$!<Anniversary>!$_
  353. ITEM1.X-ANNIVERSARY;VALUE=DATE-AND-OR-TIME:20081210
  354. ITEM2.X-ABDATE;VALUE=DATE-AND-OR-TIME:20091210
  355. ITEM2.X-ABLABEL:_$!<Anniversary>!$_
  356. ITEM2.X-ANNIVERSARY;VALUE=DATE-AND-OR-TIME:20091210
  357. ITEM3.X-ABDATE;VALUE=DATE-AND-OR-TIME:20101210
  358. ITEM3.X-ABLABEL:_$!<Anniversary>!$_
  359. ITEM3.X-ANNIVERSARY;VALUE=DATE-AND-OR-TIME:20101210
  360. END:VCARD
  361. OUT;
  362. $vcard = Reader::read($input);
  363. $vcard = $vcard->convert(Document::VCARD30);
  364. $this->assertVObjEquals(
  365. $output,
  366. $vcard
  367. );
  368. // Swapping input and output
  369. list(
  370. $input,
  371. $output
  372. ) = array(
  373. $output,
  374. $input
  375. );
  376. $vcard = Reader::read($input);
  377. $vcard = $vcard->convert(Document::VCARD40);
  378. $this->assertVObjEquals(
  379. $output,
  380. $vcard
  381. );
  382. }
  383. function testNoLabel() {
  384. $input = <<<VCF
  385. BEGIN:VCARD
  386. VERSION:3.0
  387. UID:foo
  388. N:Doe;John;;;
  389. FN:John Doe
  390. item1.X-ABDATE;type=pref:2008-12-11
  391. END:VCARD
  392. VCF;
  393. $vcard = Reader::read($input);
  394. $this->assertInstanceOf('Sabre\\VObject\\Component\\VCard', $vcard);
  395. $vcard = $vcard->convert(Document::VCARD40);
  396. $vcard = $vcard->serialize();
  397. $converted = Reader::read($vcard);
  398. $converted->validate();
  399. $version = Version::VERSION;
  400. $expected = <<<VCF
  401. BEGIN:VCARD
  402. VERSION:4.0
  403. PRODID:-//Sabre//Sabre VObject $version//EN
  404. UID:foo
  405. N:Doe;John;;;
  406. FN:John Doe
  407. ITEM1.X-ABDATE;PREF=1:2008-12-11
  408. END:VCARD
  409. VCF;
  410. $this->assertEquals($expected, str_replace("\r","", $vcard));
  411. }
  412. }